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

Artifact 2db13eac09ac2d45b2cfd5dd106d6b9b02fe413db7240731868d55467e981b85:


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 70 50 61 72 73 65 2c 20 2a 70 70 57 68 65 72  (pParse, *ppWher
2da0: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2db0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2dc0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2dd0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2de0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2df0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2e00: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2e10: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
2e20: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
2e30: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
2e40: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
2e50: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2e60: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2e70: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2e80: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2e90: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2ea0: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2eb0: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2ec0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2ee0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2ef0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2f00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2f10: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2f20: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2f30: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2f40: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2f50: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2f60: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2f70: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2f80: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2f90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2fa0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2fb0: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2fc0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2fd0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2fe0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2ff0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
3000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
3010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
3020: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3030: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
3040: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
3050: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
3060: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
3070: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
3080: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
3090: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
30a0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
30b0: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
30c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
30d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
30f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
3100: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
3110: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
3120: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
3130: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
3140: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
3150: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
3160: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
3170: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
3180: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
3190: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
31a0: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
31b0: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
31c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
31d0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
31e0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
31f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
3200: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
3210: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
3220: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
3230: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
3240: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
3250: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
3260: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
3280: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
3290: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
32a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
32b0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
32c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
32e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
32f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
3300: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
3310: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
3320: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
3330: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
3340: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
3350: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
3360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3370: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
3430: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
3440: 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f   Undo the work o
3450: 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e  f setJoinExpr().
3460: 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73    In the express
3470: 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76  ion tree p, conv
3480: 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72  ert every.** ter
3490: 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64  m that is marked
34a0: 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
34b0: 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e  n and iRightJoin
34c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e  Table==iTable in
34d0: 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
34e0: 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74  y term that omit
34f0: 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  s the EP_FromJoi
3500: 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  n mark..**.** Th
3510: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
3520: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73  a LEFT JOIN is s
3530: 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61  implified into a
3540: 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
3550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3560: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  unsetJoinExpr(Ex
3570: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
3580: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
3590: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
35a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
35b0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
35c0: 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70  & (iTable<0 || p
35d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
35e0: 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20  e==iTable) ){.  
35f0: 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
3600: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
3610: 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Join);.    }.   
3620: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3630: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3640: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3650: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3660: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3680: 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69          unsetJoi
3690: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
36a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
36b0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
36c0: 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f     }.    unsetJo
36d0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
36e0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
36f0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
3700: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3710: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3720: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3730: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3750: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3760: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3770: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3780: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3790: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
37a0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
37b0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
37c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
37d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
37e0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
37f0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
3800: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3810: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3820: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3830: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3840: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3850: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3860: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3870: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3880: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3890: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
38a0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
38b0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
38c0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
38d0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
38e0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
38f0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
3900: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3910: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3920: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3930: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3940: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3950: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3960: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3980: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3990: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
39a0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
39b0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
39c0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
39d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
39e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3a20: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3a30: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3a50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3a60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3a70: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3a80: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3a90: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3ab0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
3ac0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
3ad0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
3ae0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
3af0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
3b00: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3b10: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3b30: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3b40: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  {.    Table *pRi
3b60: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
3b70: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
3b80: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
3b90: 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54   NEVER(pLeft->pT
3ba0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
3bb0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
3bc0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
3bd0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
3be0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3bf0: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3c00: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3c10: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3c20: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3c30: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3c40: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3c50: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3c60: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3c70: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3c80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
3ca0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
3cb0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
3cc0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
3cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3cf0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3d00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3d20: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3d30: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3d40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3d60: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3d70: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d90: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
3da0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
3db0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3dd0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
3de0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3e00: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3e10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3e20: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3e30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3e40: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3e60: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3e70: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e80: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3e90: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
3ea0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
3eb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3ec0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ed0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3f00: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3f10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3f20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3f30: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3f40: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3f50: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3f60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3f70: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3f80: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3fb0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
3fc0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
3fd0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
3fe0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3ff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
4000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4010: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
4020: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
4030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4040: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
4050: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
4060: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
4070: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
4080: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
4090: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
40a0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
40b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
40c0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
40d0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
40e0: 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  rAnd(pParse, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ac0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11ae0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11b00 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11b10 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11b30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11b40 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11b50 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11b60 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11b70 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11b80 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b90 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11bb0 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11bc0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11be0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11bf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c10 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11c20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11c50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11c80 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c90 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11cb0 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11cc0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11cd0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11ce0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11cf0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11d00 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11d10 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11d20 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11d30 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11d40 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11d50 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11d60 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11d70 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11d80 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d90 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11da0 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11db0 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11dc0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11dd0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11de0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11e00 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11e10 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e40 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11e50 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11e70 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11e80 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11ea0 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11eb0 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11ec0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11ed0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11f10 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11f20 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11f30 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11f40 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11f50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11f60 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11f70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11f80 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11fa0 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11fb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11fc0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12010 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12020 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12030 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12040 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12050 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12060 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12070 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12080 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12090 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
120a0 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
120b0 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
120c0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
120d0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
120e0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
120f0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12110 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12120 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12130 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12140 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12150 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12160 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12170 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12180 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12190 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
121a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
121b0 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
121c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
121d0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
121e0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
121f0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12200 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12210 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12220 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12230 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12240 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12250 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12260 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12270 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12280 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12290 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
122a0 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
122b0 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
122c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
122d0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
122e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
122f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12300 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12310 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12320 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12330 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12340 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12350 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12360 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12370 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12380 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12390 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
123a0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
123b0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
123c0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
123d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
123e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
123f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12400 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12410 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12420 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12430 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12440 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12450 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12460 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12470 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12480 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61  ;.  u64 savedFla
12490 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
124a0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
124b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124c0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
124d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
124e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
124f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12510 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12520 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  t, 0);.  db->fla
12530 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
12570 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
12580 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
12590 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73  rior;.  pTab = s
125a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
125b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
125c0 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
125d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
125e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
125f0 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12600 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12610 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12620 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12630 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12640 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
12650 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
12660 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
12670 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
12680 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
12690 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
126a0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
126b0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
126c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
126d0 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
126e0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
126f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12700 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12710 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12720 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12730 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12740 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
12750 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
12760 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
12770 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
12780 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12790 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
127a0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
127b0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
127c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
127d0 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
127e0 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
127f0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12800 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12810 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12820 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12830 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12840 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
12850 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
12860 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
12870 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
12880 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
12890 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
128a0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
128b0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
128c0 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
128d0 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
128e0 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
128f0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12900 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12910 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12920 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12930 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12940 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
12950 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
12960 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
12970 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
12980 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
12990 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
129a0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
129b0 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
129c0 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
129d0 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
129e0 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
129f0 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12a00 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12a10 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12a20 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12a30 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12a40 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12a50 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
12a60 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
12a70 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
12a80 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
12a90 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
12aa0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
12ab0 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12ac0 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12ad0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12ae0 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12af0 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12b00 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12b10 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12b20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12b30 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12b40 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
12b60 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
12b70 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
12b80 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
12b90 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
12ba0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12bb0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12bc0 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12bd0 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12be0 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12bf0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12c00 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12c10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12c20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12c30 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12c40 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12c50 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
12c60 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
12c70 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
12c80 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
12c90 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
12ca0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
12cb0 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12cc0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12cd0 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12ce0 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12cf0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12d00 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12d10 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12d20 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12d30 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12d40 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12d50 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
12d60 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
12d70 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
12d80 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
12d90 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
12da0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
12db0 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12dc0 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12dd0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12de0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12df0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12e00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12e10 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12e20 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12e30 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12e40 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12e50 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
12e60 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
12e70 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
12e80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
12e90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
12ea0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
12eb0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12ec0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12ed0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12ee0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12ef0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12f00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12f10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12f20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12f30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12f40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12f50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
12f60 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b  .  if( pLimit ){
12f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12f80 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49  mit->op==TK_LIMI
12f90 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
12fa0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
12fb0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  0 );.    p->iLim
12fc0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
12fd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12fe0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12ff0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13000 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13010 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13020 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13030 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e  Limit->pLeft, &n
13040 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
13050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13060 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
13070 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
13080 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13090 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
130a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
130b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
130c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42  e3VdbeGoto(v, iB
130d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
130e0 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
130f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c  ->nSelectRow>sql
13100 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13110 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n) ){.        p-
13120 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
13130 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13140 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )n);.        p->
13150 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46  selFlags |= SF_F
13160 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20  ixedLimit;.     
13170 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
131a0 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69  it->pLeft, iLimi
131b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
131c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
131d0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
131e0 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
131f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
13200 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13210 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
13220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13240 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
13250 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
13260 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
13270 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69   if( pLimit->pRi
13280 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ght ){.      p->
13290 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
132a0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
132b0 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
132c0 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
132d0 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
132e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
132f0 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
13300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13310 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
13320 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66  it->pRight, iOff
13330 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
13340 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13350 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
13360 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
13370 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13380 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13390 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
133a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
133b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
133c0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
133d0 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
133e0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
133f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13400 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
13410 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
13420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13430 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
13440 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
13450 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
13460 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13470 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
13480 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
13490 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
134a0 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
134b0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
134c0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
134d0 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
134e0 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
134f0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
13500 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
13510 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
13520 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
13530 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
13540 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
13550 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
13560 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
13570 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
13580 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
13590 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
135a0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
135b0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
135c0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
135d0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
135e0 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
135f0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
13600 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
13610 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13620 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
13630 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
13640 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
13650 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
13660 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
13670 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
13680 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
13690 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
136a0 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
136b0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
136c0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
136d0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
136e0 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
136f0 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
13700 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
13710 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
13720 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
13730 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
13740 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
13750 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13760 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
13770 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
13780 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
13790 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
137a0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
137b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
137c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
137d0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
137e0 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
137f0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
13800 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
13810 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13820 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
13830 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
13840 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
13850 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
13860 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
13870 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
13880 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
13890 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
138a0 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
138b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
138c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
138d0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
138e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
138f0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
13900 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
13910 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
13920 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
13930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
13940 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
13950 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
13960 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
13970 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
13980 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
13990 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
139a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
139b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
139c0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
139d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
139e0 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
139f0 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
13a00 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
13a10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13a20 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
13a30 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
13a40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13a50 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
13a60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
13a70 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
13a80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
13a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13aa0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
13ab0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
13ac0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
13ad0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
13ae0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13af0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
13b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13b10 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
13b20 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13b30 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
13b40 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
13b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
13b60 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
13b70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
13b80 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
13b90 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
13ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13bb0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
13bc0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
13bd0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
13be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13bf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
13c00 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
13c10 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
13c20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
13c30 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
13c40 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
13c50 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
13c60 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
13c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13c80 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
13c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ca0 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
13cb0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
13cc0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
13cd0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
13ce0 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
13cf0 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
13d00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13d10 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
13d20 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
13d30 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
13d40 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
13d50 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
13d90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
13dc0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
13dd0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
13de0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
13df0 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
13e00 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
13e10 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
13e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
13e30 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
13e40 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
13e50 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
13e60 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
13e70 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
13e80 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
13e90 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
13ea0 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
13eb0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
13ec0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
13ed0 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
13ee0 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
13ef0 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
13f00 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
13f10 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
13f20 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
13f30 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
13f40 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
13f50 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
13f60 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
13f70 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
13f80 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
13f90 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
13fa0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
13fb0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
13fc0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
13fd0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
13fe0 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
13ff0 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
14000 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14010 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
14020 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
14030 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
14040 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
14050 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
14060 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
14070 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
14080 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
14090 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
140a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
140b0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
140c0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
140d0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
140e0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
140f0 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
14100 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
14110 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
14120 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
14130 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
14140 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
14150 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
14160 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
14170 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
14180 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
14190 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
141a0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
141b0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
141c0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
141d0 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
141e0 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
141f0 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
14200 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
14210 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
14220 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
14230 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
14240 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
14250 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
14260 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
14270 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
14280 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
14290 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
142a0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
142b0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
142c0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
142d0 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
142e0 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
142f0 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
14300 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
14310 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
14320 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
14330 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
14340 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
14350 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
14360 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
14370 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
14380 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
14390 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
143a0 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
143b0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
143c0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
143d0 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
143e0 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
143f0 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
14400 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
14410 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
14420 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
14430 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
14440 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
14450 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14460 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14470 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14480 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14490 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
144a0 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
144b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
144c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
144d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
144e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
144f0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14500 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
14510 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
14520 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
14530 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
14540 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
14550 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
14560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
14570 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
14580 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
14590 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
145a0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
145b0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
145c0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
145d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
145e0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
145f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
14600 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
14610 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
14620 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14630 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
14640 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
14650 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
14660 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
14670 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
14680 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
14690 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
146a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
146b0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
146c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
146d0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
146e0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
146f0 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
14700 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
14710 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
14720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14730 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14740 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
14750 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14760 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
14770 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
14780 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
14790 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
147a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
147b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
147c0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
147d0 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
147e0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
147f0 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
14800 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14810 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14840 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
14870 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
14880 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
14890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
148a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
148b0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
148e0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
148f0 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
14900 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
14910 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
14920 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
14930 53 45 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  SET */..#ifndef 
14940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
14950 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e  OWFUNC.  if( p->
14960 70 57 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  pWin ){.    sqli
14970 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14980 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
14990 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
149a0 20 69 6e 20 72 65 63 75 72 73 69 76 65 20 71 75   in recursive qu
149b0 65 72 69 65 73 22 29 3b 0a 20 20 20 20 72 65 74  eries");.    ret
149c0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
149d0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
149e0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
149f0 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
14a00 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
14a10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14a20 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
14a30 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
14a40 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
14a50 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
14a60 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
14a70 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
14a80 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
14a90 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
14aa0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
14ab0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
14ac0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
14ad0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
14ae0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14af0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14b00 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
14b10 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14b20 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
14b30 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
14b40 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
14b50 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
14b60 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
14b70 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
14b80 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
14b90 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
14ba0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
14bb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
14bc0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
14bd0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
14be0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
14bf0 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
14c00 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
14c10 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
14c20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
14c30 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
14c40 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
14c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
14c60 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14c70 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
14c80 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
14c90 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
14ca0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
14cb0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
14cc0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
14cd0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
14ce0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14cf0 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14d00 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14d10 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14d20 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14d30 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14d40 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
14d50 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
14d60 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14d70 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14d80 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
14d90 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
14da0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
14db0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14dc0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
14dd0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14de0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14df0 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14e00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14e10 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14e20 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14e30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14e40 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
14e50 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
14e60 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
14e70 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
14e80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
14e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14ea0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
14eb0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
14ec0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
14ed0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14ee0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14ef0 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14f00 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14f10 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14f40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
14f50 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
14f60 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
14f90 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
14fa0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
14fb0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14fe0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14ff0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
15000 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
15010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
15020 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
15030 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
15040 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15050 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
15060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15070 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
15080 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
15090 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
150a0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
150b0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
150c0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
150d0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
150e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
150f0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
15100 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
15110 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
15120 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
15130 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
15140 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
15150 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65   0;.  ExplainQue
15160 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15170 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20  1, "SETUP"));.  
15180 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
15190 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
151a0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
151b0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
151c0 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = p;.  if( rc ) 
151d0 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75  goto end_of_recu
151e0 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20  rsive_query;..  
151f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
15200 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75   row in the Queu
15210 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61  e and output tha
15220 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54  t row */.  addrT
15230 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15250 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64  ind, iQueue, add
15260 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
15270 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
15280 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78  Transfer the nex
15290 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f  t row in Queue o
152a0 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a  ver to Current *
152b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
152c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
152d0 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20  Row, iCurrent); 
152e0 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75  /* To reset colu
152f0 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66  mn cache */.  if
15300 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15320 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
15330 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
15340 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
15350 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  Current);.  }els
15360 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
15370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15380 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20  owData, iQueue, 
15390 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
153a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153b0 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
153c0 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  e, iQueue);..  /
153d0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e  * Output the sin
153e0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
153f0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74  nt */.  addrCont
15400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15410 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
15420 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15430 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
15440 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
15450 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15460 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
15470 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
15480 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
15490 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
154a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
154b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
154c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
154d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
154e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
154f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15500 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
15510 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15520 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
15530 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
15540 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
15550 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
15560 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
15570 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
15580 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
15590 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
155a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
155b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
155c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
155d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
155e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
155f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15600 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
15610 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
15620 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
15630 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
15640 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
15650 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15660 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
15670 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
15680 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15690 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
156a0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
156b0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
156c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
156d0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
156e0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
156f0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
15700 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
15710 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
15720 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
15730 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
15740 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15750 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
15760 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15770 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
15780 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15790 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
157a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
157b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
157c0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
157d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
157e0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
157f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
15800 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
15810 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
15820 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15830 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
15840 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15850 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15860 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15870 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15880 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15890 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
158a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
158b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
158c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
158d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
158e0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
158f0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
15900 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
15910 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
15920 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
15930 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
15940 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
15950 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
15960 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
15970 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
15980 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
15990 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
159a0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
159b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
159c0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
159d0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
159e0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
159f0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
15a00 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
15a10 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
15a20 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
15a30 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
15a40 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
15a50 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
15a60 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
15a70 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
15a80 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
15a90 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
15aa0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15ab0 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
15ac0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15ad0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
15ae0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
15af0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
15b00 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
15b10 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
15b20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
15b30 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
15b40 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
15b50 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
15b60 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
15b70 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
15b80 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
15b90 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
15ba0 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
15bb0 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
15bc0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
15bd0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
15be0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
15bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15c00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
15c10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15c20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15c30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15c40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15c50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
15c60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
15c70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
15c80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15c90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15ca0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15cb0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
15cc0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
15cd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
15ce0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
15cf0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
15d00 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15d10 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15d20 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15d30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15d40 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15d60 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15d70 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15d80 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15d90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15da0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15db0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15dc0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
15dd0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15de0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
15df0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15e00 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15e10 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15e20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15e30 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15e40 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15e50 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15e60 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15e70 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15e80 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15e90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15ea0 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15eb0 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
15ec0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
15ed0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15ee0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
15ef0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
15f00 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
15f10 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
15f20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15f30 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
15f40 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
15f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15f60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15f70 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
15f80 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
15f90 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
15fa0 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
15fb0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
15fc0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
15fd0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
15fe0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
15ff0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
16000 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
16010 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
16020 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
16030 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
16040 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
16050 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
16060 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
16070 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
16080 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
16090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
160a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
160b0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
160c0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
160d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
160e0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
160f0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
16100 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
16110 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
16120 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
16130 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
16140 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
16150 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
16160 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16170 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16180 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
16190 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
161a0 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
161b0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
161c0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
161d0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
161e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
161f0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
16200 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
16210 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
16220 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
16230 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
16250 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
16260 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
16270 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
16280 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
16290 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
162a0 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
162b0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
162c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
162d0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
162e0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
162f0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
16300 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
16310 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
16320 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
16330 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
16340 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
16350 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
16360 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
16370 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
16380 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
16390 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
163a0 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
163b0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
163c0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
163d0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
163e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
163f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16400 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16420 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
16430 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
16440 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
16450 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
16460 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16470 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
16480 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
16490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
164a0 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
164b0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
164c0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
164d0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
164e0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
164f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
16500 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
16510 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16520 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16530 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16540 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16550 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
16560 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
16570 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
16580 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
16590 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
165a0 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
165b0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
165c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
165d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
165e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
165f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
16610 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
16620 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
16630 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
16640 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
16650 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
16660 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
16670 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
16680 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
16690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
166a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
166b0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
166c0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
166d0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
166e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
166f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16700 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
16710 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
16720 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
16730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16740 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
16750 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16760 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16770 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
167a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
167b0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
167c0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
167d0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
167e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
167f0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
16800 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
16810 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16820 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
16830 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16840 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16850 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16860 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16870 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16880 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16890 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
168a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
168b0 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
168c0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
168d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
168e0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
168f0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
16900 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
16910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16920 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
16930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16940 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16950 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16960 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16970 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16980 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16990 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
169a0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
169b0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
169c0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
169d0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
169e0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
169f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16a00 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
16a10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
16a20 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
16a30 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16a40 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
16a50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16a60 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16a70 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16a80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16a90 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16aa0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16ab0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16ac0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16ad0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16ae0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16af0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
16b00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16b10 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
16b20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
16b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16b40 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
16b50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16b60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16b70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16b80 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16b90 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16ba0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16bb0 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16bc0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16bd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16be0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16bf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
16c00 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16c10 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
16c20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
16c30 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
16c40 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
16c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16c60 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
16c70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
16c80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
16c90 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16ca0 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
16cb0 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
16cc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16cd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
16ce0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
16cf0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
16d00 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
16d10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16d20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16d40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16d50 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16d60 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16d70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16d80 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16d90 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16db0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
16dc0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16dd0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
16de0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
16df0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
16e00 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16e10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16e20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16e30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16e50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16e60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16e70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16e80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16e90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16ea0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16ec0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16ed0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
16ee0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
16ef0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
16f00 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
16f10 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
16f20 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
16f30 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
16f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f50 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16f60 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
16f70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16f80 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
16f90 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
16fa0 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
16fb0 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
16fc0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
16fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ff0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
17000 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
17030 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
17040 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
17050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17060 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17070 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
17080 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
17090 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
170a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
170b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
170c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
170d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
170e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
170f0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17100 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17110 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17120 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17130 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17140 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17150 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17160 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17170 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
17180 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
17190 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
171a0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
171b0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
171c0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
171d0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
171e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
171f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17200 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
17210 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
17220 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17230 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
17240 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
17250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17260 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
17270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17280 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
172a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
172b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
172c0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
172d0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
172e0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
172f0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
17300 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17310 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
17320 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
17330 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
17340 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
17350 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
17360 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
17370 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
17380 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
17390 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
173a0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
173b0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
173c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
173d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
173e0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
173f0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
17400 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17410 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17420 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
17430 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17440 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
17450 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
17460 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17470 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
17480 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
17490 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
174a0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
174b0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
174c0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
174d0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
174e0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
174f0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
17500 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
17510 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
17520 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17530 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
17540 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
17550 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
17560 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
17570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17580 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
17590 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
175a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
175b0 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
175c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
175d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
175e0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
175f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
17600 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
17610 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17620 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
17630 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17640 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
17650 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
17670 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17690 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
176a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
176b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
176c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
176d0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
176e0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
176f0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
17700 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
17710 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
17720 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
17730 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
17740 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17750 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17760 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
17770 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
17780 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
17790 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
177a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
177b0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
177c0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
177d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
177e0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
177f0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
17800 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
17810 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17820 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17830 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17840 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
17860 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
17880 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17890 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
178a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
178b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
178c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
178d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
178e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
178f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17910 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17920 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
17930 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
17940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17950 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
17960 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
17970 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17980 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17990 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
179a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
179b0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
179c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
179d0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
179e0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
17a10 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17a30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17a40 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
17a50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17a60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17a70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
17a80 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17a90 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17aa0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17ac0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
17ad0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
17ae0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
17af0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
17b00 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
17b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17b20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
17b30 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
17b40 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17b50 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17b60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17b70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17b90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17ba0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
17bb0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17bc0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17bd0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17be0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17bf0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17c20 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17c30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
17c40 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17c50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
17c60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
17c70 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
17c80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
17c90 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
17ca0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17cb0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
17cc0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
17cd0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
17ce0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
17cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17d00 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
17d10 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17d20 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17d30 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17d40 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17d50 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17d60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17d70 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17d80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17d90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17db0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
17dc0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
17de0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
17df0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  );.          com
17e10 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
17e20 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
17e30 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  reak);.         
17e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17e60 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
17e70 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
17e80 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
17e90 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
17ea0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  );.          sel
17ec0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
17ed0 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62  rse, p, unionTab
17ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
17f00 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
17f10 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17f30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
17f40 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ont);.          
17f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f60 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
17f70 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
17f80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17fa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17fb0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
17fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17fe0 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
17ff0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
18000 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
18020 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
18030 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
18040 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  CT ); {.        
18050 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
18060 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
18070 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
18080 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  t;.        Expr 
18090 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  *pLimit;.       
180a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
180b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
180c0 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
180d0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a       int r1;.  .
180e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52          /* INTER
180f0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
18100 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
18110 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
18120 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  res.        ** t
18130 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
18140 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
18150 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
18160 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20    Begin.        
18170 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
18180 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
18190 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
181a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62    */.        tab
181b0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
181c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32  ++;.        tab2
181d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
181e0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
181f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
18200 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  0 );.  .        
18210 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18230 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18240 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b1, 0);.        
18250 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18260 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
18270 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18280 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
18290 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
182a0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
182b0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
182c0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
182d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
182e0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20  ->pEList );.  . 
182f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
18300 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
18310 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
18320 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
18330 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  1"..        */. 
18340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
18350 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
18360 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
18370 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
18380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18390 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
183a0 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
183b0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
183c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
183d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
183e0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
183f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
18400 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
18410 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
18420 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
18430 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
18440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64    */.        add
18450 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
18470 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
18480 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
18490 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
184a0 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
184b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
184c0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
184d0 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
184e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
184f0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
18500 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
18510 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
18520 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
18530 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
18540 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  b2;.        Expl
18550 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18560 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49  arse, 1, "%s USI
18570 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c  NG TEMP B-TREE",
18580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18590 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
185a0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
185b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
185c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
185d0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
185e0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ctdest);.       
185f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
18600 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
18610 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
18620 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
18630 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
18640 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
18650 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
18660 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
18670 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
18680 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
18690 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
186a0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
186b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
186c0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
186d0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70  imit);.        p
186e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
186f0 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  t;.  .        /*
18700 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18710 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
18720 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
18730 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
18740 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
18750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18760 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
18770 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
18780 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
18790 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
187a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
187b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
187c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
187d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  se);.        com
187e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
187f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
18800 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
18810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18820 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
18830 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
18840 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18850 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
18860 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18870 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18880 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
18890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
188a0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
188b0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
188c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
188d0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
188e0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
188f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
18900 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18920 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18930 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
18940 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
18950 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
18960 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18970 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
18980 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
18990 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
189a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
189b0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
189c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
189e0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
189f0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
18a00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18a20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
18a30 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18a50 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
18a60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18a80 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18a90 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18aa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18ab0 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18ad0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
18ae0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
18af0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18b00 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
18b10 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
18b20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
18b30 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18b40 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
18b50 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
18b60 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
18b70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
18b80 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18b90 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18ba0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18bb0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18bc0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18bd0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18be0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18bf0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18c00 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18c10 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18c20 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18c30 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18c40 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18c50 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18c60 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18c70 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18c80 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18c90 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18ca0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18cb0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18cc0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18cd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18ce0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18cf0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18d20 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18d30 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18d40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18d50 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18d60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18d70 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18d80 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18d90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18da0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18db0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18dc0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18dd0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18de0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18df0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18e00 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18e10 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18e40 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18e50 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18e60 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18e70 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18e80 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18e90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18ea0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18eb0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18ec0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18ed0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18ee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18ef0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18f00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18f20 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18f30 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18f40 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18f50 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18f60 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18f70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18f80 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18f90 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18fa0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18fb0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18fd0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18fe0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18ff0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
19000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
19010 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
19020 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
19030 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
19040 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
19050 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
19060 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
19070 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
19080 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
19090 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
190a0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
190b0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
190c0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
190d0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
190e0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
190f0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
19100 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
19110 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
19120 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19140 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
19150 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
19160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19170 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
19180 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19190 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
191a0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
191d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
191e0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
191f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19200 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
19210 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
19220 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
19230 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
19240 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
19250 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
19260 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
19270 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
19280 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19290 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
192a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
192b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
192c0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
192d0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
192e0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
192f0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
19300 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
19310 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
19320 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
19330 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
19340 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
19350 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
19360 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19370 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
19380 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
19390 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
193a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
193b0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
193c0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
193d0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
193e0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
193f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19410 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
19420 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
19430 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
19440 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
19450 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
19460 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
19470 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
19480 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
19490 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
194a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
194b0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
194c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
194d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
194e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
194f0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
19500 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
19510 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
19520 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
19530 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
19540 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
19550 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
19560 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
19570 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
19580 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
19590 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
195a0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
195b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
195c0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
195d0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
195e0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
195f0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
19600 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
19610 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
19620 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
19630 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
19640 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
19650 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
19660 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
19670 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19680 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
19690 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
196a0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
196b0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
196c0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
196d0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
196e0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
196f0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
19700 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
19710 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
19720 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
19730 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
19740 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
19750 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19760 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
19770 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19780 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19790 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
197c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
197d0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
197e0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
197f0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
19800 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
19810 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
19820 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
19830 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
19840 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
19850 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
19860 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
19870 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
19880 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
19890 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
198a0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
198b0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
198c0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
198d0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
198e0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
198f0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
19900 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
19910 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
19920 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
19930 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
19940 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
19950 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19960 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
19970 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
19980 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
19990 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
199a0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
199b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
199c0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
199d0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
199e0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
199f0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
19a00 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
19a10 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
19a20 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
19a30 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
19a40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19a50 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
19a60 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
19a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19a80 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
19a90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19aa0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
19ab0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
19ac0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19af0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19b00 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
19b10 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
19b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b30 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19b40 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
19b50 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
19b60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19b80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
19bb0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
19bc0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
19bd0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
19be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19bf0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19c00 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
19c10 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19c20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19c30 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
19c40 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
19c50 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
19c60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
19c70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
19c80 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
19c90 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
19ca0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
19cb0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19cc0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
19cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
19ce0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
19cf0 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
19d00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
19d10 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
19d20 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
19d30 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
19d40 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
19d50 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
19d60 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
19d70 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19d80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19d90 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
19da0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19db0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19dd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
19de0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
19df0 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
19e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19e20 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
19e30 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
19e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e50 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
19e60 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
19e70 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
19e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19e90 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ea0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
19eb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19ec0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
19ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19ee0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19ef0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
19f00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
19f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19f20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19f30 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
19f40 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
19f50 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
19f60 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
19f70 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
19f80 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
19f90 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
19fa0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
19fb0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
19fc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19fd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ff0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
1a000 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
1a010 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
1a020 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
1a030 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
1a040 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a060 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
1a070 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
1a080 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  arm, r1,.       
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20      pIn->iSdst, 
1a0b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a0c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a0d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a0e0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
1a0f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1a100 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
1a110 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
1a120 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
1a130 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
1a140 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
1a150 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
1a160 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
1a170 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
1a180 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
1a190 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
1a1a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a1b0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
1a1c0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
1a1d0 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
1a1e0 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
1a1f0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
1a200 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
1a210 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1a220 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a230 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
1a240 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
1a250 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
1a260 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
1a270 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
1a280 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
1a290 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1a2a0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1a2b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a2c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
1a2d0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1a2e0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
1a2f0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
1a300 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
1a310 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
1a320 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
1a330 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
1a340 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
1a350 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
1a360 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
1a370 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
1a380 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
1a390 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a3a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
1a3b0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a3c0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
1a3d0 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
1a3e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1a3f0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
1a400 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
1a410 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
1a420 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a440 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
1a450 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
1a460 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
1a470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a480 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
1a490 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1a4a0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
1a4b0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
1a4c0 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
1a4d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
1a4e0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
1a4f0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
1a500 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
1a510 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
1a520 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
1a530 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
1a540 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
1a550 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
1a560 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a570 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a580 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
1a590 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
1a5a0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
1a5b0 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
1a5c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
1a5d0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
1a5e0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
1a5f0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
1a600 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
1a620 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1a630 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
1a640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a650 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
1a660 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
1a670 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a690 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
1a6a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
1a6b0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
1a6c0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
1a6d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
1a6e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a700 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
1a710 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
1a720 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a730 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
1a740 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
1a750 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
1a760 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a770 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1a780 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
1a790 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a7a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
1a7b0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
1a7c0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1a7d0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
1a7e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
1a7f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
1a800 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
1a810 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
1a820 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
1a830 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
1a840 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
1a850 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
1a860 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
1a870 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
1a880 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
1a890 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
1a8a0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
1a8b0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
1a8c0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
1a8d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a8e0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
1a8f0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
1a900 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
1a910 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
1a920 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a930 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
1a940 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
1a950 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
1a960 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
1a970 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
1a980 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
1a990 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
1a9a0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
1a9b0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
1a9c0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
1a9d0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
1a9e0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
1a9f0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
1aa00 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aa10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
1aa20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aa30 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aa40 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aa50 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
1aa60 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
1aa70 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1aa80 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
1aa90 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aaa0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1aab0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1aac0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1aad0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
1aae0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
1aaf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1ab00 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
1ab10 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
1ab20 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
1ab30 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
1ab40 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
1ab50 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
1ab60 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
1ab70 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ab80 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ab90 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aba0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
1abb0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
1abc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
1abd0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
1abe0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
1abf0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
1ac00 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1ac10 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1ac20 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1ac30 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
1ac40 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
1ac50 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
1ac60 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
1ac70 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
1ac80 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
1ac90 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
1aca0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
1acb0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
1acc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1acd0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
1ace0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
1acf0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
1ad00 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
1ad10 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
1ad30 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
1ad40 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
1ad50 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
1ad60 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
1ad70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
1ad80 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
1ad90 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1ada0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1adb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
1adc0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
1add0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
1ade0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
1adf0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1ae00 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
1ae10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
1ae30 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
1ae40 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1ae50 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
1ae60 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae70 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ae80 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
1ae90 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
1aea0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
1aeb0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aec0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1aed0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
1aee0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1aef0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
1af00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1af10 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1af20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1af30 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
1af40 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
1af50 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
1af60 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
1af70 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
1af80 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
1af90 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1afa0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
1afb0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
1afc0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
1afd0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1afe0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
1aff0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
1b000 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
1b010 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
1b020 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
1b030 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
1b040 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
1b050 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1b060 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
1b070 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
1b080 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
1b090 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
1b0a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
1b0b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
1b0c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1b0d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
1b0e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
1b0f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
1b100 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
1b110 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
1b120 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
1b130 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
1b140 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
1b150 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
1b160 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
1b170 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
1b180 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
1b190 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1b1a0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
1b1b0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
1b1c0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
1b1d0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
1b1e0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
1b1f0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
1b200 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
1b210 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
1b220 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
1b230 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
1b240 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
1b250 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
1b260 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
1b270 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
1b280 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
1b290 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
1b2a0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
1b2b0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
1b2c0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
1b2d0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
1b2e0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
1b2f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
1b300 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
1b310 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
1b320 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
1b330 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
1b340 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
1b350 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
1b360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
1b370 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
1b380 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
1b390 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
1b3a0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
1b3b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b3c0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
1b3d0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
1b3e0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
1b3f0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
1b400 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
1b410 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
1b420 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
1b430 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
1b440 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
1b450 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
1b460 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
1b470 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
1b480 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
1b490 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
1b4a0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
1b4b0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
1b4c0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1b4d0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
1b4e0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
1b4f0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
1b500 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
1b510 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
1b520 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
1b530 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
1b540 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1b550 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
1b560 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
1b570 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
1b580 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b590 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1b5a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1b5b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1b5c0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b5d0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
1b5e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
1b5f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1b600 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1b610 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
1b620 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1b630 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b640 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b650 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
1b660 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
1b670 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
1b680 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
1b690 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
1b6a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1b6b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1b6c0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
1b6d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b6e0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
1b6f0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b700 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
1b710 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
1b720 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
1b730 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
1b740 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
1b750 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
1b760 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b770 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1b780 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
1b790 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
1b7a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b7b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b7c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b7d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b7e0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
1b7f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b800 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b810 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b820 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
1b830 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b840 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b850 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1b860 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
1b870 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b880 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
1b890 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b8a0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
1b8b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b8c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b8d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
1b8e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8f0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
1b900 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
1b960 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b970 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b990 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
1b9a0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
1b9b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b9c0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
1b9d0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
1b9e0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
1b9f0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1ba00 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
1ba10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1ba20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
1ba30 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
1ba40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1ba50 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
1ba60 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1ba70 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
1ba80 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ba90 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
1baa0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bab0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
1bac0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
1bad0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1bae0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
1baf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bb00 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
1bb10 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bb20 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bb30 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bb40 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
1bb50 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
1bb60 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
1bb70 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
1bb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
1bb90 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1bba0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
1bbb0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
1bbc0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
1bbd0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1bbe0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
1bbf0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
1bc00 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
1bc10 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1bc20 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
1bc30 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
1bc40 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1bc50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1bc60 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
1bc70 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
1bc80 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
1bc90 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
1bca0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
1bcb0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
1bcc0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
1bcd0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1bce0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
1bcf0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
1bd00 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
1bd30 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
1bd40 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
1bd50 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1bd60 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
1bd70 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
1bd80 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
1bd90 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
1bda0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
1bdb0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
1bdc0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bdd0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
1bde0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1bdf0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
1be00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1be10 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1be20 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
1be30 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1be40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
1be50 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1be60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1be70 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1be80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1be90 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
1bea0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
1beb0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
1bec0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
1bed0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
1bee0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
1bef0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
1bf00 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
1bf10 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
1bf20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
1bf30 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
1bf40 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1bf50 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
1bf60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1bf70 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1bf80 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
1bf90 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
1bfa0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
1bfb0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
1bfc0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1bfd0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1bfe0 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
1bff0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c000 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 0a  abel(pParse);...
1c010 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
1c020 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c030 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
1c040 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
1c050 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
1c060 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
1c070 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1c080 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1c090 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
1c0a0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
1c0b0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
1c0c0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
1c0d0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
1c0e0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
1c0f0 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
1c100 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
1c110 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
1c120 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
1c130 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
1c140 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
1c150 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
1c160 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c170 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
1c180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
1c190 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
1c1a0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
1c1b0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
1c1c0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
1c1d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c1e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c1f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c200 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1c210 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
1c220 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
1c230 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c240 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c250 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c260 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
1c270 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c280 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
1c290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c2a0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
1c2b0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
1c2c0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
1c2d0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
1c2e0 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
1c2f0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c310 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1c320 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1c330 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
1c340 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
1c350 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
1c360 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1c370 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
1c380 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1c390 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
1c3a0 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
1c3b0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
1c3c0 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
1c3d0 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
1c3e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
1c3f0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
1c400 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
1c410 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
1c420 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
1c430 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
1c440 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
1c450 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
1c460 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
1c470 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
1c480 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
1c490 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
1c4a0 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
1c4b0 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
1c4c0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
1c4d0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
1c4e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1c4f0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
1c500 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
1c510 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
1c520 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
1c530 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
1c540 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
1c550 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
1c560 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
1c570 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
1c580 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
1c590 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72  eof(int)*(nOrder
1c5a0 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20  By + 1));.  if( 
1c5b0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
1c5c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c5d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c5e0 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e   aPermute[0] = n
1c5f0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72  OrderBy;.    for
1c600 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=1, pItem=pOrd
1c610 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64  erBy->a; i<=nOrd
1c620 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
1c630 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1c640 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c650 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c670 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c680 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
1c690 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c6a0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
1c6b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c6c0 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
1c6d0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
1c6e0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1c6f0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
1c700 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
1c710 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1c720 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1c730 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
1c740 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
1c750 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1c760 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1c770 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
1c780 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
1c790 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1c7a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
1c7b0 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
1c7c0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
1c7d0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
1c7e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
1c7f0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
1c800 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
1c810 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
1c820 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
1c830 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
1c840 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
1c850 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
1c860 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
1c870 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
1c880 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1c890 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
1c8a0 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
1c8b0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
1c8c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
1c8d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1c8e0 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
1c8f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1c900 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
1c910 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
1c920 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
1c930 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
1c940 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1c950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c960 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
1c970 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
1c980 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
1c990 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
1c9a0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
1c9b0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
1c9c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
1c9d0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
1c9e0 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
1c9f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
1ca00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1ca10 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
1ca20 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
1ca30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
1ca40 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
1ca50 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
1ca60 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
1ca70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ca80 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
1ca90 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
1caa0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
1cab0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
1cac0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
1cad0 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
1cae0 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
1caf0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1cb00 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1cb10 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
1cb20 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
1cb30 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
1cb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1cb50 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
1cb60 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1cb70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1cb80 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
1cb90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1cba0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
1cbb0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
1cbc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1cbd0 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
1cbe0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
1cbf0 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
1cc00 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
1cc10 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1cc20 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
1cc30 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1cc40 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1cc50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc60 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
1cc70 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
1cc80 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
1ccc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ccd0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
1cce0 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
1ccf0 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
1cd00 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
1cd10 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
1cd20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1cd30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
1cd40 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
1cd50 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
1cd60 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cd70 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
1cd80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1cd90 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
1cda0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cdb0 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
1cdc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1cdd0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1cde0 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
1cdf0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1ce00 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1ce10 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ce20 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
1ce30 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1ce40 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1ce50 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45  ((pParse, 1, "ME
1ce60 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63  RGE (%s)", selec
1ce70 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
1ce80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ce90 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1cea0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1ceb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
1cec0 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
1ced0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
1cee0 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
1cef0 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
1cf00 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
1cf10 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1cf20 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1cf30 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1cf40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cf50 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1cf60 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
1cf70 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
1cf80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
1cf90 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
1cfa0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
1cfb0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70  regLimitA;.  Exp
1cfc0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
1cfd0 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22  Parse, 1, "LEFT"
1cfe0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ));.  sqlite3Sel
1cff0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
1d000 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
1d010 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1d020 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1d030 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
1d040 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1d050 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  dr1);..  /* Gene
1d060 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1d070 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d090 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
1d0a0 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
1d0b0 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
1d0c0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
1d0d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1d0e0 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1d0f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1d100 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1d110 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1d120 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
1d130 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
1d140 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
1d150 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
1d160 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
1d170 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
1d180 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
1d190 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
1d1a0 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
1d1b0 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45  ffset = 0;  .  E
1d1c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1d1d0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47  (pParse, 1, "RIG
1d1e0 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  HT"));.  sqlite3
1d1f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1d200 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
1d210 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
1d220 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
1d230 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
1d240 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1d250 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1d260 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
1d270 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d280 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1d290 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1d2a0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
1d2b0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1d2c0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1d2d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1d2e0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
1d2f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d300 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
1d310 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
1d320 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
1d330 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1d340 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d350 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1d360 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
1d370 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
1d380 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1d390 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1d3a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
1d3b0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d3c0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1d3d0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1d3e0 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
1d3f0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1d400 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1d410 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d430 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1d440 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
1d450 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d460 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1d470 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
1d480 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
1d490 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1d4a0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1d4c0 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
1d4d0 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
1d4e0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1d4f0 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1d500 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lEnd);.  }.  sql
1d510 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
1d520 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a  (pKeyDup);..  /*
1d530 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d540 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d550 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d560 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
1d570 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d580 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d590 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
1d5a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d5b0 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
1d5c0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d5d0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  ){.    addrEofA_
1d5e0 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d  noB = addrEofA =
1d5f0 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c   labelEnd;.  }el
1d600 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1d610 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1d620 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
1d630 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  ));.    addrEofA
1d640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d650 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d660 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1d670 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  utB);.    addrEo
1d680 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33  fA_noB = sqlite3
1d690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d6a0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1d6b0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1d6f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d700 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1d710 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  fA);.    p->nSel
1d720 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
1d730 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
1d740 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
1d750 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
1d760 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d770 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d780 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d790 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d7a0 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
1d7b0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d7c0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
1d7d0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d7e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1d7f0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d800 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
1d810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65  ;.    if( p->nSe
1d820 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72  lectRow > pPrior
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
1d840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
1d850 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d860 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  w;.  }else{  .  
1d870 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d880 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
1d890 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1d8a0 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
1d8b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d8c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d8d0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d8f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d900 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c   regAddrA, label
1d910 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
1d920 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1d930 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1d940 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
1d950 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d960 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1d970 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
1d980 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d990 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
1d9a0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1d9b0 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
1d9c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d9d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d9e0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
1d9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da00 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1da10 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1da20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1da30 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1da40 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1da50 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
1da60 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1da70 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1da80 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
1da90 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1daa0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1dab0 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
1dac0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1dad0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
1dae0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1daf0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
1db00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
1db10 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1db20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
1db30 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
1db40 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
1db50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1db60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1db70 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1db80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1db90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1dba0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1dbb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1dbc0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1dbd0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1dbe0 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
1dbf0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1dc00 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
1dc10 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
1dc20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1dc30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1dc40 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1dc50 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1dc60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1dc70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1dc80 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1dc90 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
1dca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dcb0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1dcc0 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1dcd0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dce0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dcf0 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1dd00 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1dd10 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1dd20 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1dd30 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1dd40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1dd50 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
1dd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dd70 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dd80 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dd90 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76  fA_noB); VdbeCov
1dda0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1ddb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ddc0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ddd0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1dde0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ddf0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
1de00 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
1de10 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
1de20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1de30 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
1de40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1de50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
1de60 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
1de70 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
1de80 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
1de90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
1deb0 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
1dec0 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
1ded0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
1df00 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
1df10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1df20 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
1df30 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
1df40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1df50 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
1df60 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
1df70 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f  ddrAgtB); VdbeCo
1df80 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1df90 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
1dfa0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
1dfb0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1dfc0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1dfd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1dfe0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1dff0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73  End);..  /* Reas
1e000 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1e010 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1e020 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1e030 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1e040 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1e050 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1e060 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1e070 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1e080 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1e090 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1e0a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1e0b0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1e0c0 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1e0d0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1e0e0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1e0f0 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1e100 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1e110 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1e120 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  **/.  ExplainQue
1e130 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65  ryPlanPop(pParse
1e140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
1e150 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23  se->nErr!=0;.}.#
1e160 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1e170 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e180 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1e190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e1a0 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69  T_VIEW)../* An i
1e1b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53  nstance of the S
1e1c0 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65  ubstContext obje
1e1d0 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20  ct describes an 
1e1e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69  substitution edi
1e1f0 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f  t.** to be perfo
1e200 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20  rmed on a parse 
1e210 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  tree..**.** All 
1e220 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
1e230 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69  lumns in table i
1e240 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20  Table are to be 
1e250 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72  replaced by corr
1e260 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70  esponding.** exp
1e270 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69  ressions in pELi
1e280 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  st..*/.typedef s
1e290 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65  truct SubstConte
1e2a0 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  xt {.  Parse *pP
1e2b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1e2c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1e2d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e2e0 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20   iTable;        
1e2f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e300 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1e310 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
1e320 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20  int iNewTable;  
1e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1e340 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f   table number */
1e350 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
1e360 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1e370 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  Add TK_IF_NULL_R
1e380 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61  OW opcodes on ea
1e390 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a  ch replacement *
1e3a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1e3b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  List;         /*
1e3c0 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70   Replacement exp
1e3d0 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75  ressions */.} Su
1e3e0 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20  bstContext;../* 
1e3f0 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1e400 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1e410 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1e420 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1e430 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1e440 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1e450 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78  lect(SubstContex
1e460 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74  t*, Select*, int
1e470 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1e480 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1e490 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1e4a0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1e4b0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1e4c0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1e4d0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1e4e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1e4f0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1e500 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1e510 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1e520 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1e530 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1e540 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1e550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1e560 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1e570 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1e580 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1e590 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1e5a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1e5b0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1e5c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1e5d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e5e0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1e5f0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1e600 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1e610 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1e620 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1e630 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1e640 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
1e650 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1e660 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1e670 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1e680 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1e690 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1e6a0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1e6b0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1e6c0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1e6d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1e6e0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1e6f0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1e700 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72  Subst,  /* Descr
1e710 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e720 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e730 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1e740 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
1e750 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
1e760 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29  tion occurs */.)
1e770 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
1e780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1e790 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1e7a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
1e7b0 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78  mJoin).   && pEx
1e7c0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e7d0 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e7e0 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78  ble.  ){.    pEx
1e7f0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e800 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e810 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
1e820 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1e830 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
1e840 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1e850 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1e860 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1e870 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1e880 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1e890 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1e8a0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1e8b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70        Expr *pCop
1e8c0 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69  y = pSubst->pELi
1e8d0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1e8e0 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
1e8f0 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f     Expr ifNullRo
1e900 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1e910 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21   pSubst->pEList!
1e920 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1e930 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c  lumn<pSubst->pEL
1e940 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1e950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e960 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1e970 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e980 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1e990 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1e9a0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1e9b0 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1e9c0 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1e9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e9e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e9f0 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1ea00 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1ea10 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1ea20 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1ea30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1ea40 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1ea50 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1ea60 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1ea80 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1ea90 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1eaa0 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1eab0 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1eac0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ead0 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1eae0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1eaf0 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1eb00 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1eb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
1eb20 65 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73  estcase( ExprHas
1eb30 50 72 6f 70 65 72 74 79 28 70 43 6f 70 79 2c 20  Property(pCopy, 
1eb40 45 50 5f 53 75 62 71 75 65 72 79 29 20 29 3b 0a  EP_Subquery) );.
1eb50 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1eb60 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1eb70 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1eb80 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1eb90 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1eba0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1ebb0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ebc0 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1ebd0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ebf0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ec00 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1ec10 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1ec20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1ec30 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1ec40 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1ec50 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1ec60 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1ec70 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1ec80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ec90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1eca0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1ecb0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1ecc0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1ecd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ece0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1ecf0 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1ed00 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1ed10 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1ed20 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1ed30 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1ed40 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1ed50 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1ed60 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1ed70 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ed80 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1ed90 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1eda0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1edb0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1edc0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1edd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ede0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1edf0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1ee00 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ee10 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1ee20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ee30 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ee40 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1ee50 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ee60 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ee70 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee80 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1ee90 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1eea0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1eeb0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1eec0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1eed0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1eee0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1eef0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1ef00 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1ef10 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1ef20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1ef30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1ef40 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ef50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ef60 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1ef70 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1ef80 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1ef90 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1efa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1efb0 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1efc0 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1efd0 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1efe0 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1eff0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1f000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1f010 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1f020 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1f030 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1f040 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1f050 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1f060 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1f070 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1f080 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1f090 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1f0a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f0b0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f0c0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1f0d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1f0e0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1f0f0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f100 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f110 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1f120 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1f130 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f140 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1f150 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1f160 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f170 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1f180 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1f190 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f1a0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1f1b0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1f1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f1d0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1f1e0 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1f1f0 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1f200 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1f210 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1f220 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1f230 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1f240 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f250 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1f260 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1f270 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1f280 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f2a0 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1f2b0 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1f2c0 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1f2d0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f2f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f300 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f310 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1f320 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f330 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f340 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f350 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1f360 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f370 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1f380 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1f390 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1f3a0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1f3b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f3c0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1f3d0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1f3e0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1f3f0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1f400 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1f410 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1f420 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1f430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1f440 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1f450 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1f460 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1f470 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1f480 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1f490 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1f4a0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1f4b0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1f4c0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1f4d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1f4e0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1f4f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1f500 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f510 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1f520 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1f530 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1f540 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1f550 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1f560 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1f570 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1f580 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1f590 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1f5a0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1f5b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1f5c0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f5d0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1f5e0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1f5f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f600 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1f610 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1f620 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1f630 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1f640 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1f650 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1f660 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1f670 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1f680 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1f690 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1f6a0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1f6b0 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1f6c0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1f6d0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1f6e0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1f6f0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1f700 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1f710 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1f720 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1f730 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1f740 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1f750 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1f760 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1f770 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1f780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1f790 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1f7a0 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1f7b0 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1f7c0 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1f7d0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1f7e0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1f7f0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1f800 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1f810 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1f820 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1f830 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1f840 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1f850 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1f860 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1f870 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1f880 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f890 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f8a0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f8b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f8c0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f8d0 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f8e0 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f8f0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f900 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f920 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1f930 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1f940 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1f950 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1f960 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1f970 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1f980 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1f990 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1f9a0 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1f9b0 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1f9c0 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1f9d0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1f9e0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f9f0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1fa00 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1fa10 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1fa20 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fa30 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1fa40 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1fa50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fa60 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1fa70 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1fa80 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1fa90 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1faa0 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1fab0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fac0 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1fad0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1fae0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1faf0 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1fb00 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1fb10 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1fb20 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1fb30 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1fb40 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1fb50 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1fb60 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1fb70 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1fb80 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1fb90 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1fba0 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1fbb0 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1fbc0 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1fbd0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1fbe0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1fbf0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1fc00 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1fc10 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1fc20 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1fc30 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1fc40 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc50 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fc60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fc70 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1fc80 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1fc90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1fca0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fcb0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1fcc0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1fcd0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1fce0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1fcf0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1fd00 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1fd10 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1fd20 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1fd30 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1fd40 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1fd50 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1fd60 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1fd70 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1fd80 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1fd90 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fda0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fdb0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fdc0 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1fdd0 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1fde0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fdf0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fe00 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fe10 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1fe20 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1fe30 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1fe40 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1fe50 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1fe60 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1fe70 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1fe80 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1fe90 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1fea0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1feb0 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1fec0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1fed0 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1fee0 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1fef0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1ff00 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1ff10 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1ff20 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1ff30 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ff40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ff50 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1ff60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ff70 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1ff80 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1ff90 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1ffa0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1ffb0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1ffc0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1ffd0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1ffe0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1fff0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
20000 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
20010 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
20020 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20030 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
20040 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
20050 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20060 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
20070 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
20080 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20090 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
200a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
200b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
200c0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
200d0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
200e0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
200f0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
20100 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
20110 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
20120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20130 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
20140 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
20150 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20160 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
20170 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
20180 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
20190 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
201a0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
201b0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
201c0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
201d0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
201e0 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
201f0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20200 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
20210 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
20220 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
20230 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
20240 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
20250 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
20260 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
20270 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20280 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
20290 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
202a0 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
202b0 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
202c0 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
202d0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
202e0 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
202f0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
20300 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
20310 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
20320 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20330 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20340 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
20350 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
20360 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
20370 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
20380 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
20390 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
203a0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
203b0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
203c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
203d0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
203e0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
203f0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
20400 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
20410 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
20420 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
20430 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
20440 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
20450 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
20460 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
20470 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
20480 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
20490 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
204a0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
204b0 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
204c0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
204d0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
204e0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
204f0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
20500 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
20510 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
20520 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
20530 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
20540 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
20550 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
20560 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
20570 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
20580 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
20590 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
205a0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
205b0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
205c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
205d0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
205e0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
205f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
20600 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
20610 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
20620 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
20630 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
20640 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
20650 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
20660 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
20670 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
20680 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
20690 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
206a0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
206b0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
206c0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
206d0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
206e0 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
206f0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
20700 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
20710 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
20720 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
20730 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
20740 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
20750 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20760 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20770 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20780 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
20790 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
207a0 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
207b0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
207c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
207d0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
207e0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
207f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
20800 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
20810 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
20820 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
20830 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
20840 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
20850 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
20860 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20870 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
20880 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20890 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
208a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
208b0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
208c0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
208d0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
208e0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
208f0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
20900 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
20910 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
20920 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20930 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20940 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
20950 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
20960 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
20970 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
20980 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20990 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
209a0 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
209b0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
209c0 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
209d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
209e0 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
209f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20a00 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
20a10 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
20a20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20a30 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
20a40 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
20a50 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
20a60 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
20a70 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
20a80 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20a90 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20aa0 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20ab0 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20ac0 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
20ad0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
20ae0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
20af0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
20b00 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
20b10 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
20b20 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
20b30 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
20b40 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
20b50 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20b60 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
20b70 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
20b80 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20b90 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20ba0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20bb0 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20bc0 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20bd0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20be0 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20bf0 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20c00 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20c10 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20c20 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
20c30 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
20c40 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
20c50 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28  ximal.).**.**  (
20c60 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74  25)  If either t
20c70 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74  he subquery or t
20c80 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20c90 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f  contains a windo
20ca0 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63  w.**        func
20cb0 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65  tion in the sele
20cc0 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52  ct list or ORDER
20cd0 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74   BY clause, flat
20ce0 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  tening.**       
20cf0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20d00 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  d..**.**.** In t
20d10 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
20d20 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
20d30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20d40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20d50 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
20d60 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
20d70 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
20d80 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
20d90 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
20da0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
20db0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20dc0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20dd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20de0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
20df0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
20e00 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
20e10 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
20e20 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
20e30 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
20e40 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
20e50 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
20e60 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
20e70 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
20e80 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
20e90 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
20ea0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
20eb0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
20ec0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
20ed0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
20ee0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20ef0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
20f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20f10 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
20f20 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20f30 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
20f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20f50 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
20f60 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
20f70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
20f80 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20  t isAgg         
20f90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
20fa0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
20fb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
20fc0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
20fd0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
20fe0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
20ff0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
21000 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
21010 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
21020 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
21030 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
21040 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
21050 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
21060 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21070 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
21080 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
21090 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
210a0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
210b0 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
210c0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
210d0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
210e0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
210f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21100 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
21110 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
21120 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21130 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
21140 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
21150 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
21160 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
21170 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
21180 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
21190 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
211a0 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20  wParent = -1;/* 
211b0 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c  Replacement tabl
211c0 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f  e for iParent */
211d0 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
211e0 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  n = 0; /* True i
211f0 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69  f pSub is the ri
21200 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45  ght side of a LE
21210 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20  FT JOIN */    . 
21220 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21240 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
21250 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
21260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21270 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21280 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21290 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
212a0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
212b0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
212c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
212d0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
212e0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
212f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
21300 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
21310 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
21320 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
21330 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
21340 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69  =0 );.  if( Opti
21350 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
21360 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
21370 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
21380 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
21390 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
213a0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
213b0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
213c0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
213d0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
213e0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
213f0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
21400 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
21410 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
21420 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
21430 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  Sub!=0 );..#ifnd
21440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
21450 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
21460 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d  p->pWin || pSub-
21470 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
21480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21490 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
214a0 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66  n (25) */.#endif
214b0 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
214c0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
214d0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
214e0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
214f0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
21500 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21510 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
21520 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
21530 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
21540 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21550 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
21560 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
21570 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
21580 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
21590 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
215a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
215b0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
215c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
215d0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
215e0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
215f0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
21600 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
21610 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
21620 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
21630 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21640 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
21650 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21660 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21670 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
21680 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21690 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69  Sub->pLimit->pRi
216a0 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ght ) return 0; 
216b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
216c0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
216d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
216e0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
216f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
21700 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21740 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
21750 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
21760 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
21770 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21790 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
217a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
217b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
217c0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
217d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
217e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
217f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21800 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
21810 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
21820 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
21830 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21840 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
21850 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
21860 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
21870 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21880 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
218c0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
218d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
218e0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
218f0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21910 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21920 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
21930 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
21940 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
21950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21960 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21970 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
21980 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
21990 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
219a0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
219b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
219c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
219d0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
219e0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
219f0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
21a00 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
21a10 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
21a20 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
21a30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
21a40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21a50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21a60 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21a70 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
21a80 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
21a90 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
21aa0 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65  lf (3a). Example
21ab0 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
21ac0 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  not.  ** allowed
21ad0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
21ae0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
21af0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
21b00 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
21b10 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
21b20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
21b30 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
21b40 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
21b50 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
21b60 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
21b70 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
21b80 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
21b90 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
21ba0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21bb0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21bc0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21bd0 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  N, then the oute
21be0 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e  r.  ** query can
21bf0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
21c00 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20  ate. (3c)  This 
21c10 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f  is an artifact o
21c20 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61  f the way.  ** a
21c30 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72  ggregates are pr
21c40 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20  ocessed - there 
21c50 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20  is no mechanism 
21c60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a  to determine if.
21c70 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f    ** the LEFT JO
21c80 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  IN table should 
21c90 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a  be all-NULL..  *
21ca0 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20  *.  ** See also 
21cb0 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33  tickets #306, #3
21cc0 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20  50, and #3300.. 
21cd0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
21ce0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21cf0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
21d00 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  ){.    isLeftJoi
21d10 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  n = 1;.    if( p
21d20 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c  SubSrc->nSrc>1 |
21d30 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72  | isAgg || IsVir
21d40 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b  tual(pSubSrc->a[
21d50 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
21d60 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20    /*  (3a)      
21d70 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20         (3c)     
21d80 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  (3b) */.      re
21d90 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21da0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21db0 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
21dc0 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
21dd0 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
21de0 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
21df0 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
21e00 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
21e10 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
21e20 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
21e30 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
21e40 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
21e50 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
21e60 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
21e70 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  oin, even.    **
21e80 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
21e90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
21ea0 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
21eb0 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
21ec0 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20  NullRow .    ** 
21ed0 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  opcode. */.    i
21ee0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a  sLeftJoin = -1;.
21ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
21f00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   Restriction (17
21f10 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  ): If the sub-qu
21f20 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21f30 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
21f40 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
21f50 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
21f60 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
21f70 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
21f80 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
21f90 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
21fa0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
21fb0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
21fc0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
21fd0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
21fe0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
21ff0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
22000 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
22010 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
22020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22030 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
22040 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20  ion (20) */.    
22050 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
22060 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
22070 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
22080 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
22090 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
220a0 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c  rn 0; /* (17d1),
220b0 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64   (17d2), or (17d
220c0 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  3) */.    }.    
220d0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
220e0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
220f0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
22100 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22110 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22120 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22130 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22140 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22150 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22160 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22170 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22180 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
22190 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
221a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
221b0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
221c0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
221e0 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
221f0 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
22200 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
22210 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
22220 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
22230 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f  0    /* (17b) */
22240 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
22250 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
22260 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20  /* (17a) */.    
22290 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
222a0 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20  c->nSrc<1       
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
222d0 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a  7c) */.      ){.
222e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
222f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22300 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
22310 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
22320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
22330 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e  estriction (18).
22340 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
22350 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
22360 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
22370 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
22380 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
22390 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
223a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
223b0 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
223c0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
223d0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
223e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d   }.  }..  /* Ex-
223f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  restriction (23)
22400 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  :.  ** The only 
22410 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63  way that the rec
22420 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
22430 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e   CTE can contain
22440 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a   a compound.  **
22450 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72   subquery is for
22460 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
22470 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   be one term of 
22480 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
22490 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
224a0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65  y is a join, the
224b0 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  n the flattening
224c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
224d0 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a  n stopped by.  *
224e0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * restriction (1
224f0 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  7d3).  */.  asse
22500 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
22510 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
22520 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72  ==0 || pSub->pPr
22530 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a  ior==0 );..  /**
22540 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
22550 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
22560 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
22570 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
22580 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
22590 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
225a0 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  u.%p from term %
225b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
225c0 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73           pSub->s
225d0 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f  elId, pSub, iFro
225e0 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
225f0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
22600 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
22610 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
22620 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
22630 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
22640 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
22650 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
22660 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
22670 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
22680 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
22690 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
226a0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
226b0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
226c0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
226d0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
226e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
226f0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
22700 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
22710 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
22720 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
22730 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
22740 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
22750 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
22760 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
22770 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
22780 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
22790 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
227a0 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
227b0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
227c0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
227d0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
227e0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
227f0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
22800 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
22810 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
22820 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
22830 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
22840 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
22850 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
22860 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
22870 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
22880 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
22890 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
228a0 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
228b0 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
228c0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
228d0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
228e0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
228f0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
22900 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
22910 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
22920 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
22930 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
22940 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
22950 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22960 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22970 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
22980 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
22990 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
229a0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
229b0 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
229c0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
229d0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
229e0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
229f0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
22a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22a10 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
22a20 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
22a30 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22a40 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22a50 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
22a60 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
22a70 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22a80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22a90 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
22aa0 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
22ab0 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
22ac0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
22ad0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
22ae0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
22af0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22b00 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
22b10 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
22b20 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
22b30 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
22b40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
22b50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
22b60 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
22b70 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
22b80 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
22b90 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
22ba0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
22bb0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
22bc0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
22bd0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
22be0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22bf0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
22c00 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
22c10 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
22c20 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
22c30 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
22c40 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22c50 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
22c60 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
22c70 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
22c80 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
22c90 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
22ca0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22cc0 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
22cd0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
22ce0 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
22cf0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
22d00 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
22d10 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
22d20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
22d30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
22d40 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(2,pParse,p,(
22d50 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22d60 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20  ry flattener".  
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72              " cr
22d90 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72  eates %u as peer
22da0 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29  \n",pNew->selId)
22db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22dc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22dd0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22de0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22df0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22e00 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22e10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22e20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22e30 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22e40 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22e50 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22e60 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
22e70 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
22e80 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
22e90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22ea0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
22eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22ec0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22ed0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22ef0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22f00 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22f10 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22f20 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22f30 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22f40 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22f50 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
22f60 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
22f70 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f80 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
22f90 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
22fa0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
22fb0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22fc0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22fd0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22fe0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22ff0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
23000 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
23010 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
23020 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
23030 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
23040 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
23050 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
23060 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
23070 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
23080 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
23090 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
230a0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
230b0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
230c0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
230d0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
230e0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
230f0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
23100 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
23110 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
23120 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
23130 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
23140 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23150 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23160 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23170 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
23180 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
23190 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
231a0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
231b0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
231c0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
231d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
231e0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
231f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
23200 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
23210 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
23220 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
23230 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
23240 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
23250 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
23260 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
23270 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
23280 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
23290 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
232a0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
232b0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
232c0 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
232d0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
232e0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
232f0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
23300 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
23310 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
23320 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
23330 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
23340 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
23350 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23360 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
23370 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23380 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
23390 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
233a0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
233b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
233c0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
233d0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
233e0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
233f0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
23400 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
23410 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
23420 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
23430 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
23440 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
23450 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
23460 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
23470 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
23480 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
23490 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
234a0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
234b0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
234c0 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
234d0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
234e0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
234f0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
23500 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
23510 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
23520 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
23530 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
23540 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
23550 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
23560 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
23570 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23580 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
23590 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
235a0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
235b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
235c0 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
235d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
235e0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
235f0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
23600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23610 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23620 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
23630 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23640 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
23650 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
23660 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
23670 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
23680 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
23690 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
236a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
236b0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
236c0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
236d0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
236e0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
236f0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
23700 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
23710 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
23720 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
23730 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b   pSrc==0 ) break
23740 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23750 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
23760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
23770 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
23780 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
23790 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
237a0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
237b0 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
237c0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
237d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
237e0 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
237f0 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
23800 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
23810 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
23820 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
23830 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
23840 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
23850 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
23870 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23880 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23890 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
238a0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
238b0 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
238c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
238d0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
238e0 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
238f0 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
23900 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
23910 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
23920 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
23930 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
23940 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
23950 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
23960 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
23970 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
23980 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23990 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
239a0 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
239b0 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
239c0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
239d0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
239e0 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
239f0 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
23a00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23a10 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
23a20 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23a30 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
23a40 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
23a50 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23a60 65 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  e(pParse, pSrc, 
23a70 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
23a80 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  1);.      if( pS
23a90 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rc==0 ) break;. 
23aa0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23ab0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d  rc = pSrc;.    }
23ac0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
23ad0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
23ae0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
23af0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
23b00 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
23b10 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23b30 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23b40 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23b50 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23b60 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23b70 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23b80 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23b90 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23bb0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23bc0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23bd0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23be0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23bf0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23c00 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23c10 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23c20 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23c30 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23c40 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23c50 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23c60 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23c70 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23c80 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23c90 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23ca0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23cb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23cc0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23cd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23ce0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23cf0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23d00 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23d10 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23d20 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23d30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23d40 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23d50 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23d60 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23d70 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23d80 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23d90 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23da0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23db0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23dc0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23de0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23df0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23e00 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23e10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23e20 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23e30 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23e40 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23e50 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23e60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23e70 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23e80 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23e90 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23ea0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23eb0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23ec0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23ed0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23ee0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23ef0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23f00 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23f10 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23f20 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23f30 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23f40 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23f50 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23f60 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23f70 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23f80 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23f90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23fa0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23fb0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23fc0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23fd0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23fe0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ff0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
24000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
24010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24020 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
24030 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
24040 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
24050 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
24060 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
24070 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
24080 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
24090 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
240a0 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
240b0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
240c0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
240d0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
240e0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
240f0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
24100 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
24110 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24120 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24130 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24140 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24150 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24160 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24170 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24190 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
241a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
241b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
241c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
241d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
241e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
241f0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
24200 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
24210 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24220 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24230 3d 20 70 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a  = pSub->pWhere;.
24240 20 20 20 20 70 53 75 62 2d 3e 70 57 68 65 72 65      pSub->pWhere
24250 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73   = 0;.    if( is
24260 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
24270 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
24280 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
24290 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
242a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
242b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
242c0 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
242d0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29  pParent->pWhere)
242e0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
242f0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
24300 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
24310 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70  ext x;.      x.p
24320 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
24330 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
24340 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   iParent;.      
24350 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e  x.iNewTable = iN
24360 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
24370 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69  x.isLeftJoin = i
24380 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20  sLeftJoin;.     
24390 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
243a0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
243b0 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20  substSelect(&x, 
243c0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  pParent, 0);.   
243d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
243e0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
243f0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
24400 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
24410 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
24420 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
24430 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
24440 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
24450 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
24460 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
24470 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
24480 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
24490 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
244a0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
244b0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
244c0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
244d0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
244e0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
244f0 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
24500 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
24510 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
24520 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
24530 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
24540 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
24550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
24560 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
24570 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
24580 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
24590 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
245a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
245b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
245c0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
245d0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
245e0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
245f0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
24600 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
24610 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24620 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
24630 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
24640 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
24650 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
24660 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
24670 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
24680 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
24690 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
246a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
246b0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
246c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
246d0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
246e0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
246f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24700 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
24710 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
24720 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20  EW) */../*.** A 
24730 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b 65 65  structure to kee
24740 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f  p track of all o
24750 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
24760 75 65 73 20 74 68 61 74 20 61 72 65 20 66 69 78  ues that are fix
24770 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e  ed to.** a known
24780 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20 57 48   value due to WH
24790 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
247a0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
247b0 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e  rm COLUMN=VALUE.
247c0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
247d0 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 57 68  ct WhereConst Wh
247e0 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74  ereConst;.struct
247f0 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20   WhereConst {.  
24800 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
24810 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24820 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ext */.  int nCo
24830 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  nst;      /* Num
24840 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43  ber for COLUMN=C
24850 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f  ONSTANT terms */
24860 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20  .  int nChng;   
24870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24880 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e   times a constan
24890 74 20 69 73 20 70 72 6f 70 61 67 61 74 65 64 20  t is propagated 
248a0 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70 45 78  */.  Expr **apEx
248b0 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69  pr;   /* [i*2] i
248c0 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a  s COLUMN and [i*
248d0 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f  2+1] is VALUE */
248e0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .};../*.** Add a
248f0 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
24900 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e  e pConst object.
24910 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
24920 20 61 64 64 20 64 75 70 6c 69 63 61 74 65 0a 2a   add duplicate.*
24930 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65  * pColumn entire
24940 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
24950 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20  d constInsert(. 
24960 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f   WhereConst *pCo
24970 6e 73 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  nst,      /* The
24980 20 57 68 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f   WhereConst into
24990 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e   which we are in
249a0 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70  serting */.  Exp
249b0 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *pColumn,     
249c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c        /* The COL
249d0 55 4d 4e 20 70 61 72 74 20 6f 66 20 74 68 65 20  UMN part of the 
249e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
249f0 45 78 70 72 20 2a 70 56 61 6c 75 65 20 20 20 20  Expr *pValue    
24a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24a10 56 41 4c 55 45 20 70 61 72 74 20 6f 66 20 74 68  VALUE part of th
24a20 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
24a30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
24a40 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f  sert( pColumn->o
24a50 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
24a60 0a 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35  .  /* 2018-10-25
24a70 20 74 69 63 6b 65 74 20 5b 63 66 35 65 64 32 30   ticket [cf5ed20
24a80 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72  f].  ** Make sur
24a90 65 20 74 68 65 20 73 61 6d 65 20 70 43 6f 6c 75  e the same pColu
24aa0 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65 72 74  mn is not insert
24ab0 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
24ac0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
24ad0 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  i<pConst->nConst
24ae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
24af0 74 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  t Expr *pExpr = 
24b00 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69  pConst->apExpr[i
24b10 2a 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  *2];.    assert(
24b20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
24b30 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28  OLUMN );.    if(
24b40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
24b50 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a  pColumn->iTable.
24b60 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
24b70 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d  Column==pColumn-
24b80 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >iColumn.    ){.
24b90 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f        return;  /
24ba0 2a 20 41 6c 72 65 61 64 79 20 70 72 65 73 65 6e  * Already presen
24bb0 74 2e 20 20 52 65 74 75 72 6e 20 77 69 74 68 6f  t.  Return witho
24bc0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
24bd0 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  g. */.    }.  }.
24be0 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73  .  pConst->nCons
24bf0 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61  t++;.  pConst->a
24c00 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44  pExpr = sqlite3D
24c10 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
24c20 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Const->pParse->d
24c30 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  b, pConst->apExp
24c40 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
24c50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e              pCon
24c60 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a  st->nConst*2*siz
24c70 65 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20 20 69  eof(Expr*));.  i
24c80 66 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  f( pConst->apExp
24c90 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e  r==0 ){.    pCon
24ca0 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a  st->nConst = 0;.
24cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
24cc0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
24cd0 28 70 56 61 6c 75 65 2c 20 45 50 5f 46 69 78 65  (pValue, EP_Fixe
24ce0 64 43 6f 6c 29 20 29 20 70 56 61 6c 75 65 20 3d  dCol) ) pValue =
24cf0 20 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a   pValue->pLeft;.
24d00 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78      pConst->apEx
24d10 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73  pr[pConst->nCons
24d20 74 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e  t*2-2] = pColumn
24d30 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ;.    pConst->ap
24d40 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f  Expr[pConst->nCo
24d50 6e 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75  nst*2-1] = pValu
24d60 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
24d70 46 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f  Find all terms o
24d80 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f  f COLUMN=VALUE o
24d90 72 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69  r VALUE=COLUMN i
24da0 6e 20 70 45 78 70 72 20 77 68 65 72 65 20 56 41  n pExpr where VA
24db0 4c 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73  LUE.** is a cons
24dc0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
24dd0 61 6e 64 20 77 68 65 72 65 20 74 68 65 20 74 65  and where the te
24de0 72 6d 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  rm must be true 
24df0 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
24e00 20 70 61 72 74 20 6f 66 20 74 68 65 20 41 4e 44   part of the AND
24e10 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
24e20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
24e30 6f 6e 2e 20 20 46 6f 72 20 65 61 63 68 20 74 65  on.  For each te
24e40 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64  rm.** found, add
24e50 20 69 74 20 74 6f 20 74 68 65 20 70 43 6f 6e 73   it to the pCons
24e60 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
24e70 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 64  static void find
24e80 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 57 68 65  ConstInWhere(Whe
24e90 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c  reConst *pConst,
24ea0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
24eb0 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
24ec0 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 70 45 78  pLeft;.  if( pEx
24ed0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
24ee0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24ef0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24f00 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
24f10 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
24f20 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
24f30 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68     findConstInWh
24f40 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70  ere(pConst, pExp
24f50 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
24f60 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24f70 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24f80 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75  pLeft);.    retu
24f90 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  rn;.  }.  if( pE
24fa0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29  xpr->op!=TK_EQ )
24fb0 20 72 65 74 75 72 6e 3b 0a 20 20 70 52 69 67 68   return;.  pRigh
24fc0 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
24fd0 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78  t;.  pLeft = pEx
24fe0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73  pr->pLeft;.  ass
24ff0 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
25000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
25010 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  t!=0 );.  if( pR
25020 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
25030 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48  UMN.   && !ExprH
25040 61 73 50 72 6f 70 65 72 74 79 28 70 52 69 67 68  asProperty(pRigh
25050 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a  t, EP_FixedCol).
25060 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25070 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66  rIsConstant(pLef
25080 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t).   && sqlite3
25090 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33  IsBinary(sqlite3
250a0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
250b0 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61  lSeq(pConst->pPa
250c0 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74  rse,pLeft,pRight
250d0 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )).  ){.    cons
250e0 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20  tInsert(pConst, 
250f0 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a  pRight, pLeft);.
25100 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4c    }else.  if( pL
25110 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
25120 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  MN.   && !ExprHa
25130 73 50 72 6f 70 65 72 74 79 28 70 4c 65 66 74 2c  sProperty(pLeft,
25140 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20   EP_FixedCol).  
25150 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
25160 73 43 6f 6e 73 74 61 6e 74 28 70 52 69 67 68 74  sConstant(pRight
25170 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49  ).   && sqlite3I
25180 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42  sBinary(sqlite3B
25190 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
251a0 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Seq(pConst->pPar
251b0 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29  se,pLeft,pRight)
251c0 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
251d0 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70  Insert(pConst, p
251e0 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
251f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25200 20 69 73 20 61 20 57 61 6c 6b 65 72 20 65 78 70   is a Walker exp
25210 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ression callback
25220 2e 20 20 70 45 78 70 72 20 69 73 20 61 20 63 61  .  pExpr is a ca
25230 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69  ndidate expressi
25240 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  on.** to be repl
25250 61 63 65 64 20 62 79 20 61 20 76 61 6c 75 65 2e  aced by a value.
25260 20 20 49 66 20 70 45 78 70 72 20 69 73 20 65 71    If pExpr is eq
25270 75 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20  uivalent to one 
25280 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
25290 73 20 6e 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b  s named in pWalk
252a0 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68  er->u.pConst, th
252b0 65 6e 20 6f 76 65 72 77 72 69 74 65 20 69 74 20  en overwrite it 
252c0 77 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72  with its.** corr
252d0 65 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e  esponding value.
252e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
252f0 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74  ropagateConstant
25300 45 78 70 72 52 65 77 72 69 74 65 28 57 61 6c 6b  ExprRewrite(Walk
25310 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
25320 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
25330 20 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74   i;.  WhereConst
25340 20 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20   *pConst;.  if( 
25350 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
25360 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 52  LUMN ) return WR
25370 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
25380 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
25390 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65  y(pExpr, EP_Fixe
253a0 64 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 57  dCol) ) return W
253b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70  RC_Continue;.  p
253c0 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d  Const = pWalker-
253d0 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72  >u.pConst;.  for
253e0 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e  (i=0; i<pConst->
253f0 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  nConst; i++){.  
25400 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20    Expr *pColumn 
25410 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  = pConst->apExpr
25420 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28 20 70  [i*2];.    if( p
25430 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20  Column==pExpr ) 
25440 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
25450 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c  ( pColumn->iTabl
25460 65 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e!=pExpr->iTable
25470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25480 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43   if( pColumn->iC
25490 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43  olumn!=pExpr->iC
254a0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
254b0 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74 63 68  ;.    /* A match
254c0 20 69 73 20 66 6f 75 6e 64 2e 20 20 41 64 64 20   is found.  Add 
254d0 74 68 65 20 45 50 5f 46 69 78 65 64 43 6f 6c 20  the EP_FixedCol 
254e0 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20 20 20  property */.    
254f0 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b  pConst->nChng++;
25500 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72  .    ExprClearPr
25510 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25520 5f 4c 65 61 66 29 3b 0a 20 20 20 20 45 78 70 72  _Leaf);.    Expr
25530 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
25540 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b  r, EP_FixedCol);
25550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
25560 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
25570 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
25580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
25590 70 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  p(pConst->pParse
255a0 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70  ->db, pConst->ap
255b0 45 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b  Expr[i*2+1], 0);
255c0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
255d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
255e0 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
255f0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f   WHERE-clause co
25600 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
25610 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
25620 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
25630 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
25640 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
25650 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e   form COLUMN=CON
25660 53 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53  STANT or.** CONS
25670 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74  TANT=COLUMN that
25680 20 6d 75 73 74 20 62 65 20 74 72 65 65 20 28 69   must be tree (i
25690 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
256a0 66 20 74 68 65 20 74 65 72 6d 73 20 74 6f 70 2d  f the terms top-
256b0 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e  level.** AND-con
256c0 6e 65 63 74 65 64 20 74 65 72 6d 73 20 74 68 61  nected terms tha
256d0 74 20 61 72 65 20 6e 6f 74 20 70 61 72 74 20 6f  t are not part o
256e0 66 20 61 20 4f 4e 20 63 6c 61 75 73 65 20 66 72  f a ON clause fr
256f0 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a  om a LEFT JOIN).
25700 2a 2a 20 74 68 65 6e 20 74 68 72 6f 75 67 68 6f  ** then througho
25710 75 74 20 74 68 65 20 71 75 65 72 79 20 72 65 70  ut the query rep
25720 6c 61 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f  lace all other o
25730 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 43 4f  ccurrences of CO
25740 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e  LUMN.** with CON
25750 53 54 41 4e 54 20 77 69 74 68 69 6e 20 74 68 65  STANT within the
25760 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
25770 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
25780 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
25790 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  **      SELECT *
257a0 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
257b0 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39 20 41   WHERE t1.a=39 A
257c0 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44  ND t2.b=t1.a AND
257d0 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a   t3.c=t2.b.**.**
257e0 20 49 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   Is transformed 
257f0 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  into.**.**      
25800 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25810 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 74  , t2, t3 WHERE t
25820 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d  1.a=39 AND t2.b=
25830 33 39 20 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a  39 AND t3.c=39.*
25840 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
25850 20 69 66 20 61 6e 79 20 74 72 61 6e 73 66 6f 72   if any transfor
25860 6d 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 61  mations where ma
25870 64 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  de and false if 
25880 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  not..**.** Imple
25890 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
258a0 20 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   Constant propag
258b0 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b 79 20  ation is tricky 
258c0 64 75 65 20 74 6f 20 61 66 66 69 6e 69 74 79 0a  due to affinity.
258d0 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  ** and collating
258e0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 65 72 61   sequence intera
258f0 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65  ctions.  Conside
25900 72 20 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a  r this example:.
25910 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  **.**    CREATE 
25920 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 2c 62  TABLE t1(a INT,b
25930 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e   TEXT);.**    IN
25940 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
25950 55 45 53 28 31 32 33 2c 27 30 31 32 33 27 29 3b  UES(123,'0123');
25960 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25970 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
25980 31 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20  123 AND b=a;.** 
25990 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
259a0 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20   t1 WHERE a=123 
259b0 41 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a  AND b=123;.**.**
259c0 20 54 68 65 20 74 77 6f 20 53 45 4c 45 43 54 20   The two SELECT 
259d0 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65  statements above
259e0 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 64   should return d
259f0 69 66 66 65 72 65 6e 74 20 61 6e 73 77 65 72 73  ifferent answers
25a00 2e 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77  .  b=a.** is alw
25a10 61 79 20 74 72 75 65 20 62 65 63 61 75 73 65 20  ay true because 
25a20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75  the comparison u
25a30 73 65 73 20 6e 75 6d 65 72 69 63 20 61 66 66 69  ses numeric affi
25a40 6e 69 74 79 2c 20 62 75 74 20 62 3d 31 32 33 0a  nity, but b=123.
25a50 2a 2a 20 69 73 20 66 61 6c 73 65 20 62 65 63 61  ** is false beca
25a60 75 73 65 20 69 74 20 75 73 65 73 20 74 65 78 74  use it uses text
25a70 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 27 30   affinity and '0
25a80 31 32 33 27 20 69 73 20 6e 6f 74 20 74 68 65 20  123' is not the 
25a90 73 61 6d 65 20 61 73 20 27 31 32 33 27 2e 0a 2a  same as '123'..*
25aa0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
25ab0 20 74 68 69 73 2c 20 74 68 65 20 65 78 70 72 65   this, the expre
25ac0 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f  ssion tree is no
25ad0 74 20 61 63 74 75 61 6c 6c 79 20 63 68 61 6e 67  t actually chang
25ae0 65 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22  ed from.** "b=a"
25af0 20 74 6f 20 22 62 3d 31 32 33 22 20 62 75 74 20   to "b=123" but 
25b00 72 61 74 68 65 72 20 74 68 65 20 22 61 22 20 69  rather the "a" i
25b10 6e 20 22 62 3d 61 22 20 69 73 20 74 61 67 67 65  n "b=a" is tagge
25b20 64 20 77 69 74 68 20 45 50 5f 46 69 78 65 64 43  d with EP_FixedC
25b30 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 22 31  ol.** and the "1
25b40 32 33 22 20 76 61 6c 75 65 20 69 73 20 68 75 6e  23" value is hun
25b50 67 20 6f 66 66 20 6f 66 20 74 68 65 20 70 4c 65  g off of the pLe
25b60 66 74 20 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64  ft pointer.  Cod
25b70 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72  e generator.** r
25b80 6f 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20  outines know to 
25b90 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 6e  generate the con
25ba0 73 74 61 6e 74 20 22 31 32 33 22 20 69 6e 73 74  stant "123" inst
25bb0 65 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75  ead of looking u
25bc0 70 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  p the.** column 
25bd0 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f  value.  Also, to
25be0 20 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e   avoid collation
25bf0 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20   problems, this 
25c00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
25c10 2a 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  ** only attempte
25c20 64 20 69 66 20 74 68 65 20 22 61 3d 31 32 33 22  d if the "a=123"
25c30 20 74 65 72 6d 20 75 73 65 73 20 74 68 65 20 64   term uses the d
25c40 65 66 61 75 6c 74 20 42 49 4e 41 52 59 20 63 6f  efault BINARY co
25c50 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
25c60 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65  ic int propagate
25c70 43 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50 61 72  Constants(.  Par
25c80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
25c90 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
25ca0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
25cb0 20 2a 70 20 20 20 20 20 20 20 20 2f 2a 20 54 68   *p        /* Th
25cc0 65 20 71 75 65 72 79 20 69 6e 20 77 68 69 63 68  e query in which
25cd0 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20 63 6f   to propagate co
25ce0 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
25cf0 57 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20  WhereConst x;.  
25d00 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20  Walker w;.  int 
25d10 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70  nChng = 0;.  x.p
25d20 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
25d30 20 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e    do{.    x.nCon
25d40 73 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43  st = 0;.    x.nC
25d50 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61  hng = 0;.    x.a
25d60 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 66  pExpr = 0;.    f
25d70 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
25d80 26 78 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  &x, p->pWhere);.
25d90 20 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74      if( x.nConst
25da0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
25db0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
25dc0 29 29 3b 0a 20 20 20 20 20 20 77 2e 70 50 61 72  ));.      w.pPar
25dd0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
25de0 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
25df0 63 6b 20 3d 20 70 72 6f 70 61 67 61 74 65 43 6f  ck = propagateCo
25e00 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74  nstantExprRewrit
25e10 65 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65  e;.      w.xSele
25e20 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
25e30 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
25e40 6f 70 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c  op;.      w.xSel
25e50 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
25e60 3b 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b 65 72  ;.      w.walker
25e70 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  Depth = 0;.     
25e80 20 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78   w.u.pConst = &x
25e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
25ea0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d 3e 70  alkExpr(&w, p->p
25eb0 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
25ec0 6c 69 74 65 33 44 62 46 72 65 65 28 78 2e 70 50  lite3DbFree(x.pP
25ed0 61 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78  arse->db, x.apEx
25ee0 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67  pr);.      nChng
25ef0 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20   += x.nChng;.   
25f00 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e   }.  }while( x.n
25f10 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65 74 75  Chng );  .  retu
25f20 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66  rn nChng;.}..#if
25f30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25f40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
25f50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
25f60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
25f70 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
25f80 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
25f90 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
25fa0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
25fb0 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
25fc0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
25fd0 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
25fe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
25ff0 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
26000 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
26010 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
26020 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
26030 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
26040 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
26050 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
26060 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
26070 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
26080 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
26090 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
260a0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
260b0 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
260c0 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
260d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
260e0 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
260f0 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
26100 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
26110 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
26120 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
26130 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
26140 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69   (** This restri
26150 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65  ction was remove
26160 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e  d on 2017-09-29.
26170 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20    We used to.** 
26180 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c            disall
26190 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ow this optimiza
261a0 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61  tion for aggrega
261b0 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 62  te subqueries, b
261c0 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ut now.**       
261d0 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65      it is allowe
261e0 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68 65  d by putting the
261f0 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
26200 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
26210 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
26220 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e 47  The added HAVING
26230 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74   clause is point
26240 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62 71  less if the subq
26250 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20  uery lacks.**   
26260 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50 20          a GROUP 
26270 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  BY clause.  But 
26280 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c  such a HAVING cl
26290 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72  ause is also har
262a0 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  mless.**        
262b0 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73     so there does
262c0 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62   not appear to b
262d0 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20  e any reason to 
262e0 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a  add extra logic.
262f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f 20  **           to 
26300 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29  suppress it. **)
26310 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
26320 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
26330 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
26340 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
26350 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
26360 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
26370 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
26380 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
26390 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
263a0 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
263b0 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73 65 20  **       clause 
263c0 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
263d0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
263e0 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
263f0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
26400 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
26410 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
26420 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a  FT JOIN and the.
26430 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73  **       express
26440 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64  ion to be pushed
26450 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63   down does not c
26460 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ome from the ON 
26470 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
26480 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49  on that LEFT JOI
26490 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  N..**.**   (5) T
264a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
264b0 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
264c0 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
264d0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
264e0 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
264f0 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43  FT JOIN where iC
26500 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65  ursor is not the
26510 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
26520 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20  e of that.**    
26530 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41     left join.  A
26540 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  n example:.**.**
26550 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
26560 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  T *.**          
26570 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20   FROM (SELECT 1 
26580 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS a1 UNION ALL 
26590 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a  SELECT 2) AS aa.
265a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49  **           JOI
265b0 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62  N (SELECT 1 AS b
265c0 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  2 UNION ALL SELE
265d0 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28  CT 2) AS bb ON (
265e0 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20  a1=b2).**       
265f0 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53      LEFT JOIN (S
26600 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e  ELECT 8 AS c3 UN
26610 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39  ION ALL SELECT 9
26620 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32  ) AS cc ON (b2=2
26630 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54  );.**.**       T
26640 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
26650 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a  r is three rows:
26660 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c    (1,1,NULL),(2,
26670 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a  2,8),(2,2,9)..**
26680 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68         But if th
26690 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65  e (b2=2) term we
266a0 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  re to be pushed 
266b0 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62  down into the bb
266c0 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20   subquery,.**   
266d0 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c      then the (1,
266e0 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c  1,NULL) row woul
266f0 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e  d be suppressed.
26700 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68 65  .**.**   (6) The
26710 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66 65 61   inner query fea
26720 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tures one or mor
26730 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  e window-functio
26740 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20  ns (since .**   
26750 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20 74      changes to t
26760 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26770 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  of the inner que
26780 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20  ry could change 
26790 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 77 69  the .**       wi
267a0 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63 68 20  ndow over which 
267b0 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
267c0 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 29   are calculated)
267d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
267e0 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
267f0 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
26800 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
26810 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
26820 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
26830 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
26840 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
26850 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
26860 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
26870 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
26880 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
26890 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
268a0 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
268b0 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
268c0 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
268d0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
268e0 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
268f0 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
26900 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
26910 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
26920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
26930 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
26940 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
26950 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20    int iCursor,  
26960 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
26970 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
26980 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
26990 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20  t isLeftJoin    
269a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
269b0 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68  Subq is the righ
269c0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
269d0 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78   JOIN */.){.  Ex
269e0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
269f0 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
26a00 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
26a10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
26a20 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
26a30 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
26a40 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
26a50 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
26a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26a70 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
26a80 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57 69 6e   if( pSubq->pWin
26a90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
26aa0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26ab0 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  6) */.#endif..#i
26ac0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26ad0 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  G.  /* Only the 
26ae0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20  first term of a 
26af0 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76  compound can hav
26b00 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e  e a WITH clause.
26b10 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20    But make.  ** 
26b20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65  sure no other te
26b30 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53  rms are marked S
26b40 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20 63  F_Recursive in c
26b50 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68  ase something ch
26b60 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68  anges.  ** in th
26b70 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  e future..  */. 
26b80 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70   {.    Select *p
26b90 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d  X;  .    for(pX=
26ba0 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
26bb0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
26bc0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65   assert( (pX->se
26bd0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
26be0 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20  ursive))==0 );. 
26bf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
26c00 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c  .  if( pSubq->pL
26c10 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72  imit!=0 ){.    r
26c20 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26c30 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
26c40 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65   }.  while( pWhe
26c50 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
26c60 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  {.    nChng += p
26c70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
26c80 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
26c90 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
26ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74   iCursor, isLeft
26cd0 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72  Join);.    pWher
26ce0 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66  e = pWhere->pLef
26cf0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c  t;.  }.  if( isL
26d00 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45  eftJoin.   && (E
26d10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26d20 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
26d30 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  n)==0.         |
26d40 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  | pWhere->iRight
26d50 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
26d60 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  or).  ){.    ret
26d70 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
26d80 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d  ction (4) */.  }
26d90 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
26da0 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
26db0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57  _FromJoin) && pW
26dc0 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
26dd0 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29  Table!=iCursor )
26de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
26df0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26e00 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
26e10 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
26e20 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
26e30 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
26e40 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
26e50 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
26e60 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
26e70 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77  xt x;.      pNew
26e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
26e90 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  p(pParse->db, pW
26ea0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
26eb0 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e  unsetJoinExpr(pN
26ec0 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78  ew, -1);.      x
26ed0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
26ee0 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
26ef0 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
26f00 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
26f10 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
26f20 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b  .isLeftJoin = 0;
26f30 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
26f40 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b  = pSubq->pEList;
26f50 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
26f60 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77  bstExpr(&x, pNew
26f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75  );.      if( pSu
26f80 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
26f90 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
26fa0 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48         pSubq->pH
26fb0 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
26fc0 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70  xprAnd(pParse, p
26fd0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
26fe0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
26ff0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
27000 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
27010 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
27020 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c  , pSubq->pWhere,
27030 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
27040 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
27050 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
27060 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
27070 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
27080 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
27090 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
270a0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
270b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
270c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46  */../*.** The pF
270d0 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  unc is the only 
270e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
270f0 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  on in the query.
27100 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a    Check to see.*
27110 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  * if the query i
27120 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
27130 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
27140 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  timization. .**.
27150 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
27160 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
27170 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
27180 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65  ptimization, the
27190 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d  n set.** *ppMinM
271a0 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45  ax to be an ORDE
271b0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  R BY clause to b
271c0 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f  e used for the o
271d0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  ptimization.** a
271e0 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72  nd return either
271f0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27200 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
27210 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e  RBY_MAX dependin
27220 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20  g on.** whether 
27230 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29  pFunc is a min()
27240 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
27250 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
27260 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
27270 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
27280 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
27290 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a  zation, return.*
272a0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
272b0 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75  NORMAL (which mu
272c0 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a  st be zero)..**.
272d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
272e0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61  must be called a
272f0 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66  fter aggregate f
27300 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65  unctions have be
27310 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75  en.** located bu
27320 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61  t before their a
27330 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65  rguments have be
27340 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20  en subjected to 
27350 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61  aggregate.** ana
27360 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lysis..*/.static
27370 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
27380 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
27390 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69  r *pFunc, ExprLi
273a0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
273b0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
273c0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
273d0 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  L;      /* Retur
273e0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70  n value */.  Exp
273f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
27400 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20  pFunc->x.pList; 
27410 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
27420 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
27430 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27440 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *zFunc;         
27450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
27460 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  me of aggregate 
27470 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a  function pFunc *
27480 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
27490 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72  rderBy;.  u8 sor
274a0 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  tOrder;..  asser
274b0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
274c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75  );.  assert( pFu
274d0 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  nc->op==TK_AGG_F
274e0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28  UNCTION );.  if(
274f0 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
27500 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
27510 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20   return eRet;.  
27520 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75  zFunc = pFunc->u
27530 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  .zToken;.  if( s
27540 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
27550 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
27560 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
27570 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
27580 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
27590 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20  SQLITE_SO_ASC;. 
275a0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
275b0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
275c0 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
275d0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
275e0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
275f0 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
27600 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65  TE_SO_DESC;.  }e
27610 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
27620 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d  eRet;.  }.  *ppM
27630 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79  inMax = pOrderBy
27640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
27650 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
27660 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
27670 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64  pOrderBy!=0 || d
27680 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27690 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
276a0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
276b0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
276c0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75  ortOrder;.  retu
276d0 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
276e0 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
276f0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
27700 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
27710 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
27720 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
27730 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
27740 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
27750 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
27760 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
27770 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
27780 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
27790 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
277a0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
277b0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
277c0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
277d0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
277e0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
277f0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
27800 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
27810 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
27820 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
27830 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
27840 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
27850 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
27860 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
27870 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
27880 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
27890 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
278a0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
278b0 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
278c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
278d0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
278e0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
278f0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
27900 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
27910 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
27920 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
27930 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
27940 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
27950 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
27960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
27970 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
27980 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
27990 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
279a0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
279b0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
279c0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
279d0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
279e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
279f0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
27a00 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
27a10 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
27a20 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
27a30 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
27a40 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
27a50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27a60 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
27a70 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
27a80 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
27a90 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
27aa0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
27ab0 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
27ac0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
27ad0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
27ae0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
27af0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
27b00 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
27b10 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
27b20 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
27b30 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
27b40 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
27b50 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
27b60 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
27b70 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
27b80 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
27b90 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
27ba0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
27bb0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
27bc0 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
27bd0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
27be0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
27bf0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
27c00 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
27c10 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27c20 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
27c30 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
27c40 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
27c50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27c60 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
27c70 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
27c80 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49  && pFrom->fg.isI
27c90 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
27ca0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
27cb0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
27cc0 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20  har *zIndexedBy 
27cd0 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64  = pFrom->u1.zInd
27ce0 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65  exedBy;.    Inde
27cf0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
27d00 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
27d10 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
27d20 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
27d30 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
27d40 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20   zIndexedBy); . 
27d50 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
27d60 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
27d70 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
27d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
27da0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
27db0 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30  ", zIndexedBy, 0
27dc0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
27dd0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
27de0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27df0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27e00 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
27e10 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  BIndex = pIdx;. 
27e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
27e30 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
27e40 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
27e50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
27e60 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
27e70 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
27e80 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
27e90 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
27ea0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
27eb0 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
27ec0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
27ed0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
27ee0 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
27ef0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
27f00 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
27f10 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
27f20 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
27f30 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
27f40 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
27f50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
27f60 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
27f70 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
27f80 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
27f90 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
27fa0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
27fb0 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
27fc0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
27fd0 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
27fe0 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
27ff0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
28000 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
28010 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
28020 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
28030 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
28040 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
28050 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
28060 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
28070 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
28080 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
28090 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
280a0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
280b0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
280c0 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
280d0 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
280e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
280f0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
28100 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
28110 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
28120 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
28130 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
28140 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
28150 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
28160 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
28170 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
28180 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
28190 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
281a0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
281b0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
281c0 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
281d0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
281e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
281f0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
28200 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
28210 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
28220 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
28230 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
28240 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
28250 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
28260 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
28270 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
28280 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28290 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
282a0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
282b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
282c0 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
282d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
282e0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
282f0 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
28300 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
28310 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
28320 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
28330 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
28340 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
28350 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
28360 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
28370 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
28380 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
28390 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
283a0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
283b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
283c0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
283d0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
283e0 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
283f0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
28400 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
28410 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
28420 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
28430 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
28440 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
28450 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
28460 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
28470 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
28480 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28490 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
284a0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
284b0 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
284c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
284d0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
284e0 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
284f0 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
28500 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
28510 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28520 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
28530 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
28540 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
28550 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28560 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
28570 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
28580 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30  , TK_ASTERISK, 0
28590 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
285a0 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
285b0 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
285c0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
285d0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
285e0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
285f0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
28600 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
28610 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
28620 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d  >pWith = 0;.  p-
28630 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
28640 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
28650 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
28660 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
28670 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
28680 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76  Flags |= SF_Conv
28690 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28  erted;.  assert(
286a0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30   pNew->pPrior!=0
286b0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69   );.  pNew->pPri
286c0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
286d0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
286e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
286f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28700 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
28710 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
28720 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
28730 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
28740 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
28750 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
28760 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
28770 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
28780 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
28790 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
287a0 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
287b0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
287c0 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
287d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
287e0 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
287f0 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
28800 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
28810 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
28820 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
28830 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
28840 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
28850 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
28860 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
28870 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
28880 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
28890 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
288a0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
288b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
288c0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
288d0 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
288e0 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
288f0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
28900 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
28910 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
28920 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
28930 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
28940 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
28950 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
28960 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
28970 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
28980 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
28990 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
289a0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
289b0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
289c0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
289d0 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
289e0 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
289f0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
28a00 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
28a10 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
28a20 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
28a30 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
28a40 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
28a50 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
28a60 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
28a70 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
28a80 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
28a90 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ab0 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
28ac0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
28ad0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
28ae0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
28af0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
28b00 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
28b10 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
28b20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
28b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28b40 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
28b50 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
28b60 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
28b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
28b80 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
28b90 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
28ba0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
28bb0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
28bc0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
28bd0 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
28be0 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
28bf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
28c00 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
28c10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28c20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
28c30 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
28c40 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
28c50 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
28c60 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
28c70 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
28c80 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
28c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28ca0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28cb0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
28cc0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
28cd0 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
28ce0 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
28cf0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
28d00 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
28d10 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
28d20 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
28d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
28d40 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
28d50 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
28d60 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
28d70 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
28d80 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
28d90 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
28da0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
28db0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
28dc0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
28dd0 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
28de0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
28df0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
28e00 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
28e10 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
28e20 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
28e30 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
28e40 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
28e50 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
28e60 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
28e70 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
28e80 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
28e90 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
28ea0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
28eb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
28ec0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
28ed0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
28ee0 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
28ef0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
28f00 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
28f10 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
28f20 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
28f30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
28f40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28f50 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
28f60 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
28f70 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
28f80 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
28f90 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
28fa0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
28fb0 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
28fc0 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
28fd0 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
28fe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
28ff0 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
29000 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
29010 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
29020 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
29030 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
29040 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
29050 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
29060 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
29070 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
29080 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
29090 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
290a0 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
290b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
290c0 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
290d0 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
290e0 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
290f0 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
29100 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
29110 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
29120 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
29130 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
29140 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
29150 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
29160 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
29170 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
29180 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
29190 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
291a0 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
291b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
291c0 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
291d0 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
291e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
291f0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
29200 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
29210 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
29220 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29230 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
29240 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
29250 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
29260 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29270 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29280 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
29290 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
292a0 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
292b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
292c0 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
292d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
292e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
292f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29300 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
29310 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
29320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
29330 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
29340 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
29350 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
29380 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
29390 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
293a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
293b0 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
293c0 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
293d0 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
293e0 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
293f0 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
29400 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
29410 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
29420 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
29430 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
29440 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
29450 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
29460 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
29470 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
29480 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
29490 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
294a0 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
294b0 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
294c0 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
294d0 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
294e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
294f0 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
29500 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
29510 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
29520 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
29530 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
29540 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
29550 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
29560 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
29570 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
29580 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
29590 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
295a0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
295b0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
295c0 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
295d0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
295e0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
295f0 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
29600 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
29610 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
29620 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
29630 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29640 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
29650 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
29660 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29680 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
29690 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
296a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
296b0 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
296c0 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
296d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
296e0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
296f0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
29700 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
29710 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
29720 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
29730 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
29740 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29750 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
29760 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
29770 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
29780 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
29790 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
297a0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
297b0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
297c0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
297d0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
297e0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
297f0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
29800 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
29810 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
29820 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
29830 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
29840 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
29850 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
29860 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
29870 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29880 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29890 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
298a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
298b0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
298c0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
298d0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
298e0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
298f0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
29900 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
29910 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
29920 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
29930 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
29940 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
29950 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
29960 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
29970 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
29980 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
29990 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
299a0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
299b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
299c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
299d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
299e0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
299f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
29a00 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
29a10 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
29a20 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
29a30 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
29a40 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
29a50 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
29a60 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29a70 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
29a80 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
29a90 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
29aa0 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
29ab0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
29ac0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
29ad0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
29ae0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
29af0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
29b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29b10 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
29b20 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
29b30 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
29b40 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
29b50 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20  ->nTabRef>2 ){. 
29b60 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29b70 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
29b80 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c  pParse, "multipl
29b90 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
29ba0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a  recursive table:
29bb0 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d   %s", pCte->zNam
29bc0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
29bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29be0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
29bf0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54  assert( pTab->nT
29c00 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20  abRef==1 || .   
29c10 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d           ((pSel-
29c20 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63  >selFlags&SF_Rec
29c30 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d  ursive) && pTab-
29c40 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a  >nTabRef==2 ));.
29c50 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
29c60 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
29c70 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
29c80 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20     pSavedWith = 
29c90 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
29ca0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
29cb0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
29cc0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
29cd0 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
29ce0 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e  *pPrior = pSel->
29cf0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73  pPrior;.      as
29d00 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57  sert( pPrior->pW
29d10 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ith==0 );.      
29d20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
29d30 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20  pSel->pWith;.   
29d40 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
29d50 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50  lect(pWalker, pP
29d60 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72  rior);.      pPr
29d70 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  ior->pWith = 0;.
29d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29da0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
29db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
29dc0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29dd0 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  th;..    for(pLe
29de0 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
29df0 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
29e00 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
29e10 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
29e20 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
29e30 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
29e40 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
29e50 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
29e60 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
29e70 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
29e80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29e90 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
29ea0 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
29eb0 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
29ec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
29ed0 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
29ee0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
29ef0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
29f00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29f10 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29f20 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
29f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29f40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
29f50 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
29f60 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
29f70 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
29f80 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
29f90 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
29fa0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
29fb0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
29fc0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29fd0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
29fe0 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
29ff0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
2a000 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
2a010 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74  >zCteErr = "mult
2a020 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
2a030 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
2a040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a050 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
2a060 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
2a070 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
2a080 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
2a090 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2a0a0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
2a0b0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
2a0c0 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43    }.    pCte->zC
2a0d0 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
2a0e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
2a0f0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
2a100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a110 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
2a120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a130 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
2a140 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
2a150 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a160 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
2a170 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
2a180 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
2a190 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
2a1a0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
2a1b0 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
2a1c0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
2a1d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2a1e0 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
2a1f0 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
2a200 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
2a210 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
2a220 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
2a230 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
2a240 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
2a250 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
2a260 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
2a270 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
2a280 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
2a290 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
2a2a0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2a2b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2a2c0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2a2d0 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  e;.  if( OK_IF_A
2a2e0 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73  LWAYS_TRUE(pPars
2a2f0 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e  e->pWith) && p->
2a300 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
2a310 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
2a320 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
2a330 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20  >pWith;.    if( 
2a340 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
2a350 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2a360 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
2a370 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2a380 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
2a390 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Outer;.    }.  }
2a3a0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
2a3b0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
2a3c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2a3d0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
2a3e0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2a3f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a400 72 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e  rgument represen
2a410 74 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72  ts a.** sub-quer
2a420 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
2a430 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2a440 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
2a450 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
2a460 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c  ocates and popul
2a470 61 74 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  ates the SrcList
2a480 5f 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63  _item.pTab objec
2a490 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
2a4a0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
2a4b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
2a4c0 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d  rwise, if an OOM
2a4d0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2a4e0 74 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  tered,.** SQLITE
2a4f0 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73  _NOMEM..*/.int s
2a500 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2a510 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
2a520 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
2a530 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
2a540 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20  .  Select *pSel 
2a550 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2a560 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
2a570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
2a580 20 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61   );.  pFrom->pTa
2a590 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
2a5a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
2a5b0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
2a5c0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
2a5d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
2a5e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a5f0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
2a600 3d 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  = 1;.  if( pFrom
2a610 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
2a620 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
2a630 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
2a640 61 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d  arse->db, pFrom-
2a650 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73  >zAlias);.  }els
2a660 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  e{.    pTab->zNa
2a670 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2a680 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2a690 22 73 75 62 71 75 65 72 79 5f 25 75 22 2c 20 70  "subquery_%u", p
2a6a0 53 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d  Sel->selId);.  }
2a6b0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e  .  while( pSel->
2a6c0 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
2a6d0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
2a6e0 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  .  sqlite3Column
2a6f0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
2a700 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
2a710 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
2a720 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  pTab->aCol);.  p
2a730 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
2a740 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
2a750 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
2a760 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
2a770 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
2a780 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  ;.  pTab->tabFla
2a790 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
2a7a0 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  al;..  return pP
2a7b0 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c  arse->nErr ? SQL
2a7c0 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
2a7d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a7e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a7f0 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
2a800 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
2a810 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
2a820 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
2a830 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
2a840 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2a850 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
2a860 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
2a870 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
2a880 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
2a890 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
2a8a0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
2a8b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
2a8c0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
2a8d0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
2a8e0 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
2a8f0 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
2a900 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
2a910 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
2a920 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
2a930 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
2a940 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
2a950 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
2a960 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
2a970 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
2a980 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
2a990 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
2a9a0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
2a9b0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
2a9c0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
2a9d0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
2a9e0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
2a9f0 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
2aa00 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
2aa10 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
2aa20 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
2aa30 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
2aa40 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
2aa50 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
2aa60 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
2aa70 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
2aa80 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
2aa90 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
2aaa0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
2aab0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2aac0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
2aad0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
2aae0 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
2aaf0 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
2ab00 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
2ab10 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
2ab20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
2ab30 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
2ab40 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
2ab50 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
2ab60 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
2ab70 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
2ab80 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
2ab90 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
2aba0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
2abb0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
2abc0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
2abd0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
2abe0 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
2abf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
2ac00 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
2ac10 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
2ac20 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
2ac30 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
2ac40 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
2ac50 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
2ac60 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2ac70 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
2ac80 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
2ac90 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
2aca0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
2acb0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
2acc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2acd0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
2ace0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2acf0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
2ad00 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
2ad10 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
2ad20 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
2ad30 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
2ad40 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
2ad50 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
2ad60 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
2ad70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
2ad80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
2ad90 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
2ada0 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
2adb0 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
2adc0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
2add0 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
2ade0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2adf0 20 7d 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72   }.  if( pWalker
2ae00 2d 3e 65 43 6f 64 65 20 29 7b 0a 20 20 20 20 2f  ->eCode ){.    /
2ae10 2a 20 52 65 6e 75 6d 62 65 72 20 73 65 6c 49 64  * Renumber selId
2ae20 20 62 65 63 61 75 73 65 20 69 74 20 68 61 73 20   because it has 
2ae30 62 65 65 6e 20 63 6f 70 69 65 64 20 66 72 6f 6d  been copied from
2ae40 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 70   a view */.    p
2ae50 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61 72  ->selId = ++pPar
2ae60 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20 7d  se->nSelect;.  }
2ae70 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2ae80 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
2ae90 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73  = p->pEList;.  s
2aea0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
2aeb0 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
2aec0 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   0);..  /* Make 
2aed0 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
2aee0 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
2aef0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
2af00 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
2af10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2af20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2af30 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
2af40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
2af50 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
2af60 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
2af70 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
2af80 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
2af90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2afa0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
2afb0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
2afc0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2afd0 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
2afe0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
2aff0 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
2b000 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
2b010 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
2b020 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
2b030 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
2b040 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
2b050 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2b060 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2b070 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2b080 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
2b090 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
2b0a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
2b0b0 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
2b0c0 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
2b0d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
2b0e0 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
2b0f0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
2b100 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b110 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
2b120 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b130 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
2b140 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
2b150 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
2b160 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
2b170 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
2b180 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
2b190 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
2b1a0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
2b1b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2b1c0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
2b1d0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
2b1e0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2b1f0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
2b200 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
2b210 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2b220 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2b230 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
2b240 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b250 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b260 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
2b270 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
2b280 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
2b290 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2b2a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2b2b0 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61 72  andSubquery(pPar
2b2c0 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
2b2d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23  urn WRC_Abort;.#
2b2e0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2b2f0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
2b300 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
2b310 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
2b320 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2b330 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
2b340 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
2b350 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
2b360 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
2b370 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
2b380 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
2b390 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  m);.      if( pT
2b3a0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
2b3b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b3c0 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  if( pTab->nTabRe
2b3d0 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20  f>=0xffff ){.   
2b3e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2b3f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
2b400 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65  o many reference
2b410 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78  s to \"%s\": max
2b420 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20   65535",.       
2b430 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
2b440 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
2b450 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
2b460 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b470 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
2b480 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
2b490 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
2b4a0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
2b4b0 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  & cannotBeFuncti
2b4c0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
2b4d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2b4e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b4f0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
2b500 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2b510 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
2b520 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
2b530 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
2b540 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2b550 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e  (pTab) || pTab->
2b560 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2b570 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20     i16 nCol;.   
2b580 20 20 20 20 20 75 38 20 65 43 6f 64 65 4f 72 69       u8 eCodeOri
2b590 67 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  g = pWalker->eCo
2b5a0 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
2b5b0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
2b5c0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
2b5d0 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
2b5e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2b5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2b600 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
2b610 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
2b620 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
2b630 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
2b640 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
2b650 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
2b660 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
2b670 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
2b680 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 57  = -1;.        pW
2b690 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2b6a0 3b 20 20 2f 2a 20 54 75 72 6e 20 6f 6e 20 53 65  ;  /* Turn on Se
2b6b0 6c 65 63 74 2e 73 65 6c 49 64 20 72 65 6e 75 6d  lect.selId renum
2b6c0 62 65 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  bering */.      
2b6d0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2b6e0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
2b6f0 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
2b700 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
2b710 43 6f 64 65 20 3d 20 65 43 6f 64 65 4f 72 69 67  Code = eCodeOrig
2b720 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
2b730 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  nCol = nCol;.   
2b740 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2b750 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
2b760 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
2b770 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
2b780 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
2b790 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
2b7a0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
2b7b0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
2b7c0 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
2b7d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b7e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
2b7f0 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
2b800 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
2b810 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2b820 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
2b830 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2b840 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
2b850 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
2b860 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
2b870 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b880 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
2b890 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
2b8a0 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
2b8b0 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
2b8c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
2b8d0 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
2b8e0 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
2b8f0 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
2b900 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
2b910 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
2b920 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
2b930 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
2b940 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
2b950 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
2b960 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53  * with the TK_AS
2b970 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20  TERISK operator 
2b980 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
2b990 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
2b9a0 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69  e column.  ** li
2b9b0 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  st.  The followi
2b9c0 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
2b9d0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
2b9e0 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20  K_ASTERISK.  ** 
2b9f0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
2ba00 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20  expand each one 
2ba10 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
2ba20 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  ll columns in.  
2ba30 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  ** all tables.. 
2ba40 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
2ba50 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
2ba60 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
2ba70 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
2ba80 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
2ba90 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
2baa0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
2bab0 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
2bac0 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
2bad0 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
2bae0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
2baf0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  pE->op==TK_ASTER
2bb00 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
2bb10 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
2bb20 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
2bb30 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
2bb40 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2bb50 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
2bb60 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
2bb70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
2bb80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
2bb90 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
2bba0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
2bbb0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
2bbc0 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67  k;.    elistFlag
2bbd0 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a  s |= pE->flags;.
2bbe0 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
2bbf0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2bc00 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
2bc10 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
2bc20 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
2bc30 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
2bc40 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
2bc50 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
2bc60 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
2bc70 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
2bc80 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
2bc90 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
2bca0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
2bcb0 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
2bcc0 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
2bcd0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2bce0 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
2bcf0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
2bd00 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
2bd10 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
2bd20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
2bd30 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
2bd40 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
2bd50 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
2bd60 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2bd80 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
2bd90 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
2bda0 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
2bdb0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
2bdc0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
2bdd0 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
2bde0 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67  .      elistFlag
2bdf0 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a  s |= pE->flags;.
2be00 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
2be10 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
2be20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
2be30 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
2be40 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
2be50 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ( pE->op!=TK_AST
2be60 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20  ERISK.       && 
2be70 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
2be80 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  || pRight->op!=T
2be90 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20  K_ASTERISK).    
2bea0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2beb0 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
2bec0 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
2bed0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
2bee0 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
2bef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2bf00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2bf10 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
2bf20 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
2bf30 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2bf40 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2bf50 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
2bf60 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
2bf70 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
2bf80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
2bf90 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
2bfa0 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
2bfb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
2bfc0 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
2bfd0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
2bfe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2bff0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
2c000 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
2c010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2c020 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
2c030 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
2c040 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
2c050 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
2c060 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
2c070 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
2c080 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
2c090 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
2c0a0 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
2c0b0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
2c0c0 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
2c0d0 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
2c0e0 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
2c0f0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
2c100 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
2c110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2c120 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
2c130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c140 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2c150 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
2c160 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
2c170 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
2c180 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
2c190 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
2c1a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
2c1b0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
2c1c0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2c1d0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
2c1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
2c1f0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
2c200 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
2c210 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2c220 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
2c230 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
2c240 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
2c250 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
2c260 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2c270 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
2c280 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2c290 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
2c2a0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
2c2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
2c2c0 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
2c2d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2c2e0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2c2f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c300 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2c310 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2c320 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
2c330 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
2c340 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
2c350 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
2c360 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c370 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
2c380 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
2c390 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2c3b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c3d0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
2c3e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2c3f0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2c400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
2c410 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
2c420 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
2c430 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22  ].zDbSName : "*"
2c440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c450 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2c460 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
2c470 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2c480 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2c490 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
2c4a0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2c4b0 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
2c4c0 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
2c4d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2c4f0 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
2c500 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
2c510 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
2c520 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
2c530 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
2c540 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
2c550 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
2c560 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
2c570 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c580 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
2c590 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
2c5a0 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
2c5b0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
2c5c0 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
2c5d0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
2c5e0 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
2c5f0 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 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 63 6f 6e 74 69 6e 75 65 3b         continue;
2c620 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
2c630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c640 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
2c650 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
2c660 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74  , omit it from t
2c670 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
2c680 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
2c690 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73  t-set list unles
2c6a0 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  s the SELECT has
2c6b0 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48   the SF_IncludeH
2c6c0 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20  idden.          
2c6d0 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20    ** bit set..  
2c6e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2c6f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
2c700 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49  >selFlags & SF_I
2c710 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30  ncludeHidden)==0
2c720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2c730 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
2c740 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
2c750 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2c770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c790 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
2c7a0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2c7b0 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
2c7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c7d0 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
2c7e0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2c7f0 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2c810 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
2c820 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
2c830 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c860 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
2c870 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
2c880 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
2c890 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
2c8a0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
2c8b0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
2c8c0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
2c8d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2c8e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2c8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c900 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
2c910 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
2c920 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
2c930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c940 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
2c950 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
2c960 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
2c970 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
2c980 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
2c990 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
2c9a0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
2c9b0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
2c9c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c9d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c9e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c9f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2ca00 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
2ca10 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
2ca20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2ca30 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
2ca40 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2ca50 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
2ca60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
2ca70 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
2ca80 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2caa0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
2cab0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
2cac0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2cad0 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
2cae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2caf0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
2cb00 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2cb10 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
2cb20 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
2cb30 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61     if( zSchemaNa
2cb40 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
2cb50 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
2cb60 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2cb70 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65  _ID, zSchemaName
2cb80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cb90 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
2cba0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2cbb0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
2cbc0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2cbd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cbe0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
2cbf0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
2cc00 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
2cc10 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2cc20 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
2cc30 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bName, zName);. 
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2cc50 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d  ToFree = zColnam
2cc60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2cc70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2cc80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2cc90 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
2cca0 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
2ccb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
2ccc0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2ccd0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2cce0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  e, pNew, pExpr);
2ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cd00 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73  ite3TokenInit(&s
2cd10 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  Colname, zColnam
2cd20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2cd30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
2cd40 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
2cd50 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
2cd60 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2cd70 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
2cd80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
2cd90 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2cdb0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2cdc0 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
2cdd0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
2cde0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cdf0 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2ce10 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
2ce20 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
2ce30 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
2ce40 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
2ce50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ce60 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2ce70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2ce80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ce90 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
2cea0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2ceb0 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
2cec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
2cef0 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
2cf00 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2cf20 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
2cf30 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf50 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
2cf60 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
2cf70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2cf90 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
2cfa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2cfc0 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
2cfd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2cfe0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2cff0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d000 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
2d010 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
2d020 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
2d030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2d050 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2d060 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
2d070 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
2d080 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2d0a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2d0b0 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
2d0c0 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
2d0d0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = pNew;.  }.  if
2d0e0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20  ( p->pEList ){. 
2d0f0 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74     if( p->pEList
2d100 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
2d110 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2d120 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20  COLUMN] ){.     
2d130 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2d140 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
2d150 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
2d160 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20  sult set");.    
2d170 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2d180 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rt;.    }.    if
2d190 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20  ( (elistFlags & 
2d1a0 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53  (EP_HasFunc|EP_S
2d1b0 75 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a  ubquery))!=0 ){.
2d1c0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
2d1d0 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52  s |= SF_ComplexR
2d1e0 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  esult;.    }.  }
2d1f0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2d200 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2d210 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
2d220 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
2d230 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
2d240 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
2d250 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
2d260 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
2d270 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
2d280 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
2d290 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
2d2a0 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
2d2b0 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
2d2c0 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
2d2d0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2d2e0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
2d2f0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2d300 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
2d310 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
2d320 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
2d330 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
2d340 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
2d350 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
2d360 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
2d370 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61  nt sqlite3ExprWa
2d380 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
2d390 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
2d3a0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2d3b0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2d3c0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2d3d0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2d3e0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2d3f0 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
2d400 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
2d410 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c  e walker for SEL
2d420 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
2d430 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
2d440 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
2d450 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2d460 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  lectWalkNoop(Wal
2d470 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
2d480 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
2d490 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d4a0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2d4b0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
2d4c0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2d4d0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
2d4e0 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73  BUG./*.** Always
2d4f0 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78   assert.  This x
2d500 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d510 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
2d520 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a  roves that the.*
2d530 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  * xSelectCallbac
2d540 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f  k2 is never invo
2d550 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
2d560 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
2d570 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f  sert2(Walker *No
2d580 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d590 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d5a0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d5b0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  ;.  assert( 0 );
2d5d0 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20  .}.#endif./*.** 
2d5e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
2d5f0 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
2d600 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
2d610 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
2d620 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
2d630 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2d640 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
2d650 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
2d660 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
2d670 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
2d680 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
2d690 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
2d6a0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
2d6b0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
2d6c0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
2d6d0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
2d6e0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
2d6f0 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
2d700 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
2d710 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d720 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
2d730 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
2d740 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
2d750 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
2d760 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
2d770 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
2d780 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
2d790 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
2d7a0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
2d7b0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
2d7c0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
2d7d0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
2d7e0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
2d7f0 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
2d800 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
2d810 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2d820 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2d830 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
2d840 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2d850 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
2d860 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2d870 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2d880 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2d890 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2d8a0 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
2d8b0 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61  _TRUE(pParse->ha
2d8c0 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20  sCompound) ){.  
2d8d0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d8e0 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d  ack = convertCom
2d8f0 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62  poundSelectToSub
2d900 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65  query;.    w.xSe
2d910 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
2d920 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  0;.    sqlite3Wa
2d930 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
2d940 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
2d950 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2d960 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
2d970 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2d980 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
2d990 70 57 69 74 68 3b 0a 20 20 77 2e 65 43 6f 64 65  pWith;.  w.eCode
2d9a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
2d9b0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2d9c0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
2d9d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d9e0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
2d9f0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
2da00 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2da10 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
2da20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
2da30 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
2da40 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
2da50 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
2da60 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
2da70 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
2da80 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
2da90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
2daa0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2dab0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
2dac0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
2dad0 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
2dae0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
2daf0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2db00 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2db10 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2db20 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
2db30 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
2db40 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
2db50 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
2db60 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
2db70 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
2db80 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
2db90 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
2dba0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
2dbb0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
2dbc0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2dbd0 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
2dbe0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
2dbf0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2dc00 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
2dc10 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
2dc20 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2dc30 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2dc40 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
2dc50 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
2dc60 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2dc70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2dc80 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
2dc90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2dca0 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
2dcb0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2dcc0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2dcd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2dce0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
2dcf0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
2dd00 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2dd10 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
2dd20 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2dd30 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2dd40 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2dd50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2dd60 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2dd70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2dd80 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2dd90 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2dda0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2ddb0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2ddc0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
2ddd0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
2dde0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2ddf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2de00 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
2de10 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
2de20 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2de30 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
2de40 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
2de50 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
2de60 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
2de70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2de80 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
2de90 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
2dea0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2deb0 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
2dec0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
2ded0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2dee0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
2def0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
2df00 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
2df10 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
2df20 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2df30 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
2df40 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
2df50 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
2df60 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
2df70 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
2df80 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
2df90 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2dfa0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2dfb0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2dfc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2dfd0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dfe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dff0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
2e000 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
2e010 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2e020 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2e030 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
2e040 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2e050 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2e060 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
2e070 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2e080 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2e090 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2e0a0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
2e0b0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2e0c0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
2e0d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
2e0e0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
2e0f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e100 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2e110 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
2e120 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
2e130 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
2e140 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
2e150 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
2e160 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
2e170 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
2e180 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
2e190 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
2e1a0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2e1b0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2e1c0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
2e1d0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
2e1e0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
2e1f0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
2e200 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
2e210 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
2e220 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
2e230 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
2e240 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
2e250 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
2e260 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
2e270 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
2e280 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
2e290 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
2e2a0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
2e2b0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
2e2c0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
2e2d0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
2e2e0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
2e2f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e300 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e310 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2e320 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2e330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e340 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e350 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2e360 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
2e370 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
2e380 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
2e390 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
2e3a0 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20  assert( p!=0 || 
2e3b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e3c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
2e3d0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
2e3e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2e3f0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
2e400 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2e410 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2e420 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e430 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
2e440 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
2e450 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2e460 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e470 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
2e480 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
2e490 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
2e4a0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
2e4b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2e4c0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2e4d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e4e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e4f0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2e500 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
2e510 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
2e520 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2e530 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
2e540 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2e550 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
2e560 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
2e570 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
2e580 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2e590 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
2e5a0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
2e5b0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
2e5c0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2e5d0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
2e5e0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
2e5f0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
2e600 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2e610 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
2e620 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2e630 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2e640 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2e650 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2e660 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2e670 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2e680 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
2e690 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
2e6a0 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
2e6b0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
2e6c0 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
2e6d0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
2e6e0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
2e6f0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
2e700 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
2e710 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
2e720 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
2e730 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
2e740 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
2e750 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
2e760 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
2e770 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
2e780 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
2e790 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e7a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
2e7b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e7c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2e7d0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2e7e0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2e7f0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
2e800 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
2e810 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2e820 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2e830 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e840 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2e850 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
2e860 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
2e870 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2e880 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2e890 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
2e8a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2e8b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2e8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e8d0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2e8e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
2e8f0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
2e900 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
2e910 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
2e920 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
2e930 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2e940 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
2e950 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2e960 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
2e970 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
2e980 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
2e990 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2e9a0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
2e9b0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e9c0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
2e9d0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
2e9e0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
2e9f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2ea00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2ea10 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
2ea20 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
2ea30 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
2ea40 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
2ea50 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
2ea60 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
2ea70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2ea80 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2ea90 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
2eaa0 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
2eab0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2eac0 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b  E->x.pList,0,0);
2ead0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2eae0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2eaf0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2eb00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2eb10 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2eb40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2eb50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2eb60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2eb70 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2eb80 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2eb90 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2eba0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2ebb0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2ebc0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2ebd0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2ebe0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2ebf0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2ec00 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2ec10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2ec20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2ec30 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2ec40 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2ec50 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2ec60 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2ec70 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2ec80 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2ec90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2eca0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2ecb0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2ecc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2ecd0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2ece0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2ecf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ed00 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2ed10 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2ed20 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2ed30 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2ed40 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2ed50 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2ed60 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2ed70 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  .../*.** Update 
2ed80 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2ed90 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2eda0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2edb0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2edc0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2edd0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
2ede0 72 65 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65  regAcc is non-ze
2edf0 72 6f 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ro and there are
2ee00 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78   no min() or max
2ee10 28 29 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a  () aggregates.**
2ee20 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68   in pAggInfo, th
2ee30 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65  en only populate
2ee40 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   the pAggInfo->n
2ee50 41 63 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75  Accumulator accu
2ee60 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73  mulator.** regis
2ee70 74 65 72 73 20 69 66 20 72 65 67 69 73 74 65 72  ters if register
2ee80 20 72 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73   regAcc contains
2ee90 20 30 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77   0. The caller w
2eea0 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a  ill take care.**
2eeb0 20 6f 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20   of setting and 
2eec0 63 6c 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e  clearing regAcc.
2eed0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2eee0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2eef0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2ef00 20 69 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67   int regAcc, Agg
2ef10 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2ef20 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2ef30 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2ef40 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
2ef50 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
2ef60 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
2ef70 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2ef80 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
2ef90 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2efa0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
2efb0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2efc0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2efd0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2efe0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2eff0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2f000 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
2f010 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
2f020 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
2f030 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2f040 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
2f050 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
2f060 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2f070 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2f080 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2f090 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
2f0a0 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
2f0b0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
2f0c0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2f0d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2f0e0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
2f0f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f100 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2f110 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
2f120 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54  regAgg, 0, SQLIT
2f130 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
2f140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
2f150 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
2f160 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
2f170 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
2f180 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2f190 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
2f1a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2f1b0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
2f1c0 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
2f1d0 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
2f1e0 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
2f1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2f200 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
2f210 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
2f220 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
2f230 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
2f240 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
2f250 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
2f260 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
2f270 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
2f280 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
2f290 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
2f2a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
2f2b0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
2f2c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2f2d0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
2f2e0 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
2f2f0 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
2f300 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
2f310 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
2f320 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
2f330 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
2f340 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
2f350 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
2f360 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2f370 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2f380 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2f390 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
2f3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f3b0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
2f3c0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
2f3d0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
2f3e0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2f3f0 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
2f400 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2f410 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
2f420 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
2f430 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2f440 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2f450 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
2f460 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
2f470 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
2f480 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
2f490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f4a0 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
2f4b0 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
2f4c0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >iMem);.    sqli
2f4d0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2f4e0 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2f4f0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
2f500 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2f510 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
2f520 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2f530 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2f540 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2f550 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2f560 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2f570 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f580 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2f590 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2f5a0 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
2f5b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2f5c0 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20 20 72  mulator ){.    r
2f5d0 65 67 48 69 74 20 3d 20 72 65 67 41 63 63 3b 0a  egHit = regAcc;.
2f5e0 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74    }.  if( regHit
2f5f0 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2f600 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2f610 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2f620 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2f630 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2f640 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
2f650 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
2f660 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2f670 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
2f680 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2f690 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2f6a0 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
2f6b0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
2f6c0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2f6d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 64 64 72   = 0;.  if( addr
2f6e0 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  HitTest ){.    s
2f6f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2f700 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73  re(v, addrHitTes
2f710 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2f720 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
2f730 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
2f740 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
2f750 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
2f760 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
2f770 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
2f780 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
2f790 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
2f7a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2f7b0 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
2f7c0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2f7d0 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
2f7e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2f7f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
2f800 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
2f810 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f830 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
2f840 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
2f850 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2f860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2f870 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
2f880 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
2f890 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
2f8a0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
2f8b0 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65  ){.    int bCove
2f8c0 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20  r = (pIdx!=0 && 
2f8d0 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  (HasRowid(pTab) 
2f8e0 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  || !IsPrimaryKey
2f8f0 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20  Index(pIdx)));. 
2f900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 78     sqlite3VdbeEx
2f910 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30 2c  plain(pParse, 0,
2f920 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2f930 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2f940 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2f950 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2f960 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2f970 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2f980 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2f990 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2f9a0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2f9b0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
2f9c0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
2f9d0 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
2f9e0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2f9f0 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
2fa00 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72   by havingToWher
2fa10 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
2fa20 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f  e node passed to
2fa30 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73   the callback is
2fa40 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20   a TK_AND node, 
2fa50 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43  return .** WRC_C
2fa60 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20  ontinue to tell 
2fa70 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2fa80 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  ) to iterate thr
2fa90 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73  ough child nodes
2faa0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2fab0 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72  e, return WRC_Pr
2fac0 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  une. In this cas
2fad0 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66  e, also check if
2fae0 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70   the .** sub-exp
2faf0 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
2fb00 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72  the criteria for
2fb10 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
2fb20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  the WHERE.** cla
2fb30 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20  use. If so, add 
2fb40 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  it to the WHERE 
2fb50 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61  clause and repla
2fb60 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65  ce the sub-expre
2fb70 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20  ssion.** within 
2fb80 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2fb90 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ssion with a con
2fba0 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74  stant "1"..*/.st
2fbb0 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54  atic int havingT
2fbc0 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c  oWhereExprCb(Wal
2fbd0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2fbe0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2fbf0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
2fc00 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  AND ){.    Selec
2fc10 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d  t *pS = pWalker-
2fc20 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >u.pSelect;.    
2fc30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2fc40 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
2fc50 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  By(pWalker->pPar
2fc60 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70  se, pExpr, pS->p
2fc70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20  GroupBy) ){.    
2fc80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2fc90 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d  pWalker->pParse-
2fca0 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  >db;.      Expr 
2fcb0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
2fcc0 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
2fcd0 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
2fce0 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30  3IntTokens[1], 0
2fcf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2fd00 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  w ){.        Exp
2fd10 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d 3e  r *pWhere = pS->
2fd20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20  pWhere;.        
2fd30 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77  SWAP(Expr, *pNew
2fd40 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20  , *pExpr);.     
2fd50 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
2fd60 33 45 78 70 72 41 6e 64 28 70 57 61 6c 6b 65 72  3ExprAnd(pWalker
2fd70 2d 3e 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  ->pParse, pWhere
2fd80 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2fd90 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e   pS->pWhere = pN
2fda0 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  ew;.        pWal
2fdb0 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2fdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fdd0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2fde0 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
2fdf0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2fe00 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
2fe10 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20   eligible terms 
2fe20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20  from the HAVING 
2fe30 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72  clause of a quer
2fe40 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70  y, which is.** p
2fe50 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20 67  rocessed after g
2fe60 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20  rouping, to the 
2fe70 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68  WHERE clause, wh
2fe80 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65 64  ich is processed
2fe90 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70   before.** group
2fea0 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ing. For example
2feb0 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
2fec0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2fed0 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2fee0 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  E a=? GROUP BY b
2fef0 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20   HAVING b=? AND 
2ff00 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  c=?.**.** can be
2ff10 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a   rewritten as:.*
2ff20 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2ff30 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2ff40 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20  ERE a=? AND b=? 
2ff50 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2ff60 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65  G c=?.**.** A te
2ff70 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
2ff80 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
2ff90 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e  ligible for tran
2ffa0 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69  sfer if it consi
2ffb0 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20  sts.** entirely 
2ffc0 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64  of constants and
2ffd0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
2ffe0 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50  t are also GROUP
2fff0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a   BY terms that.*
30000 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41 52  * use the "BINAR
30010 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  Y" collation seq
30020 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
30030 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68   void havingToWh
30040 65 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ere(Parse *pPars
30050 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
30060 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
30070 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
30080 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
30090 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
300a0 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
300b0 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
300c0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61  xprCallback = ha
300d0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
300e0 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
300f0 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71  Select = p;.  sq
30100 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73  lite3WalkExpr(&s
30110 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69  Walker, p->pHavi
30120 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  ng);.#if SELECTT
30130 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
30140 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65  f( sWalker.eCode
30150 20 26 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65   && (sqlite3Sele
30160 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 29  ctTrace & 0x100)
30170 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  !=0 ){.    SELEC
30180 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
30190 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56  rse,p,("Move HAV
301a0 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57  ING terms into W
301b0 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  HERE:\n"));.    
301c0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
301d0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
301e0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
301f0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
30200 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65 6e   if the pThis en
30210 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20  try of pTabList 
30220 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f  is a self-join o
30230 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a  f a prior view..
30240 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
30250 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72 63  n return the Src
30260 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68  List_item for th
30270 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49  e prior view.  I
30280 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20  f it is not,.** 
30290 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a  then return 0..*
302a0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
302b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73  SrcList_item *is
302c0 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20  SelfJoinView(.  
302d0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
302e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
302f0 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d  Search for self-
30300 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52  joins in this FR
30310 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
30320 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30330 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53  em *pThis   /* S
30340 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20  earch for prior 
30350 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
30360 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  s subquery */.){
30370 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
30380 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
30390 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61   for(pItem = pTa
303a0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
303b0 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b  pThis; pItem++){
303c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 31  .    Select *pS1
303d0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
303e0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  >pSelect==0 ) co
303f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30400 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
30410 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75  outine ) continu
30420 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
30430 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  ->zName==0 ) con
30440 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
30450 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
30460 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c  Item->zDatabase,
30470 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61 73   pThis->zDatabas
30480 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
30490 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
304a0 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d  3_stricmp(pItem-
304b0 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a  >zName, pThis->z
304c0 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  Name)!=0 ) conti
304d0 6e 75 65 3b 0a 20 20 20 20 70 53 31 20 3d 20 70  nue;.    pS1 = p
304e0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
304f0 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 53     if( pThis->pS
30500 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21 3d 70 53  elect->selId!=pS
30510 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20 20 20 20  1->selId ){.    
30520 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 66    /* The query f
30530 6c 61 74 74 65 6e 65 72 20 6c 65 66 74 20 74 77  lattener left tw
30540 6f 20 64 69 66 66 65 72 65 6e 74 20 43 54 45 20  o different CTE 
30550 74 61 62 6c 65 73 20 77 69 74 68 20 69 64 65 6e  tables with iden
30560 74 69 63 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6e  tical.      ** n
30570 61 6d 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ames in the same
30580 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 2a 2f   FROM clause. */
30590 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
305a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
305b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
305c0 65 28 30 2c 20 70 54 68 69 73 2d 3e 70 53 65 6c  e(0, pThis->pSel
305d0 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 53 31  ect->pWhere, pS1
305e0 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 0a 20 20  ->pWhere, -1).  
305f0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
30600 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68 69  rCompare(0, pThi
30610 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 48 61 76  s->pSelect->pHav
30620 69 6e 67 2c 20 70 53 31 2d 3e 70 48 61 76 69 6e  ing, pS1->pHavin
30630 67 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  g, -1) .    ){. 
30640 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
30650 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
30660 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
30670 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
30680 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
30690 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
306a0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
306b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
306c0 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
306d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
306e0 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
306f0 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
30700 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
30710 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
30720 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
30730 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
30740 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30750 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
30760 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
30770 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
30780 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
30790 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
307a0 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
307b0 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
307c0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
307d0 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
307e0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
307f0 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
30800 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30810 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
30820 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
30830 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
30840 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
30850 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
30860 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
30870 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
30880 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20   clause.**   *  
30890 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52  There is no WHER
308a0 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  E or GROUP BY or
308b0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
308c0 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  on the subquerie
308d0 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75  s.**   *  The ou
308e0 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73  ter query is a s
308f0 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 20 77  imple count(*) w
30900 69 74 68 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  ith no WHERE cla
30910 75 73 65 20 6f 72 20 6f 74 68 65 72 0a 2a 2a 20  use or other.** 
30920 20 20 20 20 20 65 78 74 72 61 6e 65 6f 75 73 20       extraneous 
30930 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a 2a 20 52 65  syntax..**.** Re
30940 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
30950 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
30960 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a   undertaken..*/.
30970 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
30980 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
30990 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
309a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
309b0 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70  Select *pSub, *p
309c0 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70  Prior;.  Expr *p
309d0 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43  Expr;.  Expr *pC
309e0 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  ount;.  sqlite3 
309f0 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  *db;.  if( (p->s
30a00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
30a10 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74  regate)==0 ) ret
30a20 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73  urn 0;   /* This
30a30 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
30a40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   */.  if( p->pEL
30a50 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
30a60 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30a70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
30a80 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
30a90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
30aa0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
30ab0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
30ac0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
30ad0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
30ae0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
30af0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
30b00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
30b10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30b20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
30b30 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
30b40 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
30b50 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
30b60 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
30b70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73  return 0;  /* Is
30b80 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66   count() */.  if
30b90 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
30ba0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=0 ) return 0; 
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74  /* Must be count
30bd0 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  (*) */.  if( p->
30be0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
30bf0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30c10 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20  e table in FROM 
30c20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
30c30 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
30c40 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
30c50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
30c80 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
30c90 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
30ca0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
30cb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
30cd0 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72   be a compound r
30ce0 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69  y */.  do{.    i
30cf0 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f  f( pSub->op!=TK_
30d00 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ALL && pSub->pPr
30d10 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
30d20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f   /* Must be UNIO
30d30 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28  N ALL */.    if(
30d40 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20   pSub->pWhere ) 
30d50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d70 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  * No WHERE claus
30d80 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
30d90 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  b->pLimit ) retu
30da0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
30dc0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
30dd0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73  .    if( pSub->s
30de0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
30df0 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20  regate ) return 
30e00 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e  0;     /* Not an
30e10 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
30e20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70    pSub = pSub->p
30e30 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Prior;          
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e50 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76      /* Repeat ov
30e60 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  er compound */. 
30e70 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
30e80 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
30e90 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ch this point th
30ea0 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70  en it is OK to p
30eb0 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73  erform the trans
30ec0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
30ed0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
30ee0 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70  .  pCount = pExp
30ef0 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  r;.  pExpr = 0;.
30f00 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
30f10 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
30f20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
30f30 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
30f40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
30f50 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29  ete(db, p->pSrc)
30f60 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71  ;.  p->pSrc = sq
30f70 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
30f80 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
30f90 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b  zeof(*p->pSrc));
30fa0 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29  .  while( pSub )
30fb0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72  {.    Expr *pTer
30fc0 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  m;.    pPrior = 
30fd0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSub->pPrior;.  
30fe0 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d    pSub->pPrior =
30ff0 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e   0;.    pSub->pN
31000 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ext = 0;.    pSu
31010 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
31020 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
31030 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
31040 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
31050 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65  .    pSub->nSele
31060 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73  ctRow = 0;.    s
31070 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
31080 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70  lete(db, pSub->p
31090 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72  EList);.    pTer
310a0 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c  m = pPrior ? sql
310b0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
310c0 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f  pCount, 0) : pCo
310d0 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  unt;.    pSub->p
310e0 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
310f0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
31100 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b  arse, 0, pTerm);
31110 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  .    pTerm = sql
31120 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
31130 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20  , TK_SELECT, 0, 
31140 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
31150 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
31160 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75  arse, pTerm, pSu
31170 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  b);.    if( pExp
31180 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  r==0 ){.      pE
31190 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  xpr = pTerm;.   
311a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
311b0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
311c0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c  pr(pParse, TK_PL
311d0 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72  US, pTerm, pExpr
311e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  );.    }.    pSu
311f0 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  b = pPrior;.  }.
31200 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30    p->pEList->a[0
31210 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
31220 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
31230 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b  = ~SF_Aggregate;
31240 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
31250 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
31260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
31270 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
31280 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31290 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
312a0 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69  fter count-of-vi
312b0 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ew optimization:
312c0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
312d0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
312e0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
312f0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
31300 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31310 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
31320 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
31330 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
31340 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
31350 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
31360 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
31370 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
31380 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
31390 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
313a0 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
313b0 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
313c0 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
313d0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
313e0 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
313f0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
31400 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31410 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31420 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
31430 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
31440 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
31450 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
31460 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
31470 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
31480 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
31490 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
314a0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
314b0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
314c0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
314d0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
314e0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
314f0 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
31500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
31510 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
31520 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
31530 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
31540 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
31550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31560 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
31570 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
31580 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
31590 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
315a0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
315b0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
315c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
315d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
315e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
315f0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
31600 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
31610 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
31620 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
31630 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
31640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
31650 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
31660 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
31670 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
31680 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
31690 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
316a0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
316b0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
316c0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
316d0 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
316e0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
316f0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
31700 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
31710 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
31720 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
31730 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
31740 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
31750 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
31760 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
31770 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
31780 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
31790 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
317a0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
317b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
317c0 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
317d0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
317e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
317f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
31800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
31810 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
31820 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
31830 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
31840 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
31850 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
31860 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
31870 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
31880 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
31890 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
318a0 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
318b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
318c0 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
318d0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
318e0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
318f0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
31900 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
31910 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
31920 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
31930 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
31940 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
31950 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
31960 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
31970 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
31980 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
31990 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20  axOrderBy = 0;  
319a0 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42  /* Added ORDER B
319b0 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  Y for min/max qu
319c0 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69  eries */.  u8 mi
319d0 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20  nMaxFlag;       
319e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
319f0 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  g for min/max qu
31a00 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d  eries */..  db =
31a10 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
31a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
31a30 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
31a40 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
31a50 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
31a60 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
31a70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
31a80 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
31a90 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
31aa0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
31ab0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
31ac0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
31ad0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
31ae0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
31af0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31b00 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
31b10 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  E(1,pParse,p, ("
31b20 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  begin processing
31b30 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64  :\n", pParse->ad
31b40 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69  drExplain));.  i
31b50 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
31b60 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
31b70 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31b80 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31b90 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
31ba0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
31bb0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
31bc0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
31bd0 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
31be0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
31bf0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
31c00 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
31c10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
31c20 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
31c30 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
31c40 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
31c50 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31c60 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31c70 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
31c80 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
31c90 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
31ca0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
31cb0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31cc0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
31cd0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
31ce0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
31cf0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31d00 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
31d10 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31d20 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
31d30 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
31d40 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
31d50 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
31d60 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
31d70 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
31d80 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
31d90 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
31da0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
31db0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
31dc0 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
31dd0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
31de0 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
31df0 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
31e00 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
31e10 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
31e20 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
31e30 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
31e40 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
31e50 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
31e60 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
31e70 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
31e80 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
31e90 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
31ea0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
31eb0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
31ec0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
31ed0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
31ee0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31ef0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
31f00 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66  pEList!=0 );.#if
31f10 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31f20 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
31f30 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
31f40 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c  0x104 ){.    SEL
31f50 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70  ECTTRACE(0x104,p
31f60 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72  Parse,p, ("after
31f70 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
31f80 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
31f90 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31fa0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31fb0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44  #endif..  if( pD
31fc0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31fd0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
31fe0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
31ff0 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
32000 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
32010 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
32020 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  C.  if( sqlite3W
32030 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61  indowRewrite(pPa
32040 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
32050 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32060 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52    }.#if SELECTTR
32070 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
32080 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
32090 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a  race & 0x108 ){.
320a0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
320b0 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
320c0 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72  ("after window r
320d0 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20  ewrite:\n"));.  
320e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
320f0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
32100 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
32110 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32120 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
32130 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
32140 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d  >pSrc;.  isAgg =
32150 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
32160 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
32170 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
32180 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
32190 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
321a0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
321b0 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
321c0 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  to various optim
321d0 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65  izations (flatte
321e0 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c  ning subqueries,
321f0 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20   and strength.  
32200 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20  ** reduction of 
32210 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20  join operators) 
32220 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
32230 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
32240 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
32250 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
32260 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
32270 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
32280 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
32290 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
322a0 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
322b0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
322c0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
322d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
322e0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
322f0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
32300 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
32310 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
32320 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
32330 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  Tab;..    /* Con
32340 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69  vert LEFT JOIN i
32350 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72  nto JOIN if ther
32360 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74  e are terms of t
32370 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
32380 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46     ** of the LEF
32390 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74  T JOIN used in t
323a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
323b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
323c0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
323d0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
323e0 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
323f0 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
32400 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65  ullRow(p->pWhere
32410 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
32420 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  ).     && Optimi
32430 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
32440 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66  , SQLITE_Simplif
32450 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  yJoin).    ){.  
32460 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32470 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a  0x100,pParse,p,.
32480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32490 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70  ("LEFT-JOIN simp
324a0 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f  lifies to JOIN o
324b0 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29  n term %d\n",i))
324c0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
324d0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28  g.jointype &= ~(
324e0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
324f0 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
32500 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  inExpr(p->pWhere
32510 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
32520 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
32530 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f   No futher actio
32540 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f  n if this term o
32550 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
32560 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65  e is no a subque
32570 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  ry */.    if( pS
32580 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
32590 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
325a0 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
325b0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
325c0 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
325d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
325e0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
325f0 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
32600 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
32610 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
32620 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
32630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
32650 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
32660 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
32670 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
326a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
326b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
326c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
326d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
326e0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
326f0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
32700 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
32710 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
32720 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
32730 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
32740 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
32750 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
32760 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
32770 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
32780 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
32790 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
327a0 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
327b0 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
327c0 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
327d0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
327e0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
327f0 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
32800 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
32810 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
32820 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
32830 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
32840 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
32850 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
32860 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
32870 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
32880 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
32890 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
328a0 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
328b0 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
328c0 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
328d0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
328e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
328f0 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
32900 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
32910 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
32920 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
32930 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
32940 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
32950 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
32960 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
32970 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
32980 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
32990 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
329a0 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
329b0 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
329c0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
329d0 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
329e0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
329f0 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
32a00 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
32a10 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
32a20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
32a30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
32a40 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
32a50 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
32a60 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
32a70 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
32a80 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
32a90 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
32aa0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
32ab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
32ac0 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
32ad0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32ae0 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
32af0 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
32b00 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
32b10 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
32b20 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
32b30 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
32b40 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
32b50 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32b60 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
32b70 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
32b80 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
32b90 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
32ba0 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
32bb0 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
32bc0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
32bd0 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
32be0 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
32bf0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
32c00 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
32c10 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
32c20 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
32c30 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
32c40 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
32c50 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
32c60 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
32c70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
32c80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
32c90 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
32ca0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
32cb0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
32cc0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
32cd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32ce0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
32cf0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
32d00 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
32d10 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
32d20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
32d30 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
32d40 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
32d50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32d60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
32d70 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
32d80 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
32d90 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
32da0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
32db0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
32dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
32dd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32de0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
32df0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
32e00 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
32e10 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
32e20 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
32e30 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
32e40 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
32e50 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
32e60 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
32e70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
32e80 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45  pDest);.#if SELE
32e90 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32ea0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32eb0 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  0x1,pParse,p,("e
32ec0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
32ed0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
32ee0 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  ));.    if( (sql
32ef0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
32f00 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26 20  & 0x2000)!=0 && 
32f10 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
32f20 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d  Parent(pParse)==
32f30 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
32f40 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
32f50 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
32f60 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
32f70 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78  p->pNext==0 ) Ex
32f80 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
32f90 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  p(pParse);.    r
32fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
32fb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  ndif..  /* Do th
32fc0 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63  e WHERE-clause c
32fd0 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
32fe0 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ion optimization
32ff0 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   if this is.  **
33000 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65   a join.  No nee
33010 64 20 74 6f 20 73 70 65 65 64 20 74 69 6d 65 20  d to speed time 
33020 6f 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  on this operatio
33030 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71  n for non-join q
33040 75 65 72 69 65 73 0a 20 20 2a 2a 20 61 73 20 74  ueries.  ** as t
33050 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 70  he equivalent op
33060 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20  timization will 
33070 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 71 75  be handled by qu
33080 65 72 79 20 70 6c 61 6e 6e 65 72 20 69 6e 0a 20  ery planner in. 
33090 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
330a0 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20  Begin()..  */.  
330b0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
330c0 72 63 3e 31 0a 20 20 20 26 26 20 4f 70 74 69 6d  rc>1.   && Optim
330d0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
330e0 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f 70 61 67  b, SQLITE_Propag
330f0 61 74 65 43 6f 6e 73 74 29 0a 20 20 20 26 26 20  ateConst).   && 
33100 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
33110 74 73 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  ts(pParse, p).  
33120 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
33130 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
33140 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
33150 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
33160 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
33170 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
33180 70 2c 28 22 41 66 74 65 72 20 63 6f 6e 73 74 61  p,("After consta
33190 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c  nt propagation:\
331a0 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
331b0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
331c0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
331d0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
331e0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
331f0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33200 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  ,("Constant prop
33210 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68 65 6c 70  agation not help
33220 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23  ful\n"));.  }..#
33230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
33240 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
33250 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
33260 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
33270 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
33280 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
33290 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
332a0 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
332b0 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
332c0 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
332d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
332e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
332f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
33300 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
33310 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
33320 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
33330 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  if..  /* For eac
33340 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
33350 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77  OM clause, do tw
33360 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28  o things:.  ** (
33370 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e  1) Authorized un
33380 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
33390 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72  s.  ** (2) Gener
333a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
333b0 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a   sub-queries.  *
333c0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
333d0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
333e0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
333f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
33400 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
33410 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
33420 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
33430 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69  Select *pSub;.#i
33440 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33450 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
33460 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
33470 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33480 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33490 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
334a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
334b0 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45   Issue SQLITE_RE
334c0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
334d0 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f  s with a fake co
334e0 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e  lumn name for an
334f0 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  y.    ** tables 
33500 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e  that are referen
33510 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69  ced but from whi
33520 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65  ch no values are
33530 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20   extracted..    
33540 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  ** Examples of w
33550 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73  here these kinds
33560 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f   of null SQLITE_
33570 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
33580 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ons.    ** would
33590 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20   occur:.    **. 
335a0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
335b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
335c0 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  1;   -- SQLITE_R
335d0 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a  EAD t1."".    **
335e0 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a       SELECT t1.*
335f0 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20   FROM t1, t2;   
33600 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
33610 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  2."".    **.    
33620 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75  ** The fake colu
33630 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  mn name is an em
33640 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20  pty string.  It 
33650 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
33660 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a  a table to.    *
33670 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20  * have a column 
33680 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70  named by the emp
33690 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68  ty string, in wh
336a0 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69  ich case there i
336b0 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20  s no way to.    
336c0 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  ** distinguish b
336d0 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65  etween an unrefe
336e0 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64  renced table and
336f0 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72   an actual refer
33700 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
33710 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68  ** "" column. Th
33720 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
33730 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
33740 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
33750 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
33760 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
33770 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
33780 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
33790 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
337a0 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
337b0 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
337c0 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
337d0 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
337e0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
337f0 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74   empty.    ** st
33800 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b  ring for the fak
33810 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
33820 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
33830 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
33840 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
33850 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
33860 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
33870 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
33880 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
33890 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
338a0 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
338b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
338c0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
338d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
338e0 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
338f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
33900 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
33910 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
33920 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
33930 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
33940 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
33950 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
33960 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
33970 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
33980 79 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  y should only be
33990 20 67 65 6e 65 72 61 74 65 64 20 6f 6e 63 65 2c   generated once,
339a0 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
339b0 20 20 2a 2a 20 74 65 63 68 6e 69 63 61 6c 6c 79    ** technically
339c0 20 68 61 72 6d 6c 65 73 73 20 66 6f 72 20 69 74   harmless for it
339d0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
339e0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
339f0 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
33a00 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 77  owing assert() w
33a10 69 6c 6c 20 64 65 74 65 63 74 20 69 66 20 73 6f  ill detect if so
33a20 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  mething changes 
33a30 74 6f 20 63 61 75 73 65 0a 20 20 20 20 2a 2a 20  to cause.    ** 
33a40 74 68 65 20 73 61 6d 65 20 73 75 62 71 75 65 72  the same subquer
33a50 79 20 74 6f 20 62 65 20 63 6f 64 65 64 20 6d 75  y to be coded mu
33a60 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 73  ltiple times, as
33a70 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
33a80 0a 20 20 20 20 2a 2a 20 64 65 76 65 6c 6f 70 65  .    ** develope
33a90 72 73 20 74 6f 20 74 72 79 20 74 6f 20 6f 70 74  rs to try to opt
33aa0 69 6d 69 7a 65 20 74 68 65 20 73 69 74 75 61 74  imize the situat
33ab0 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ion. */.    asse
33ac0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
33ad0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 0a 20 20  illSub==0 );..  
33ae0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
33af0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
33b00 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
33b10 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
33b20 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
33b30 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
33b40 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
33b50 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
33b60 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
33b70 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
33b80 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
33b90 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
33ba0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
33bb0 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
33bc0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
33bd0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
33be0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
33bf0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
33c00 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
33c10 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
33c20 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
33c30 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
33c40 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
33c50 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
33c60 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
33c70 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  (p);..    /* Mak
33c80 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73  e copies of cons
33c90 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73  tant WHERE-claus
33ca0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f  e terms in the o
33cb0 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a  uter query down.
33cc0 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68      ** inside th
33cd0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  e subquery.  Thi
33ce0 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73  s can help the s
33cf0 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d  ubquery to run m
33d00 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e  ore efficiently.
33d10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33d20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
33d30 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50  led(db, SQLITE_P
33d40 75 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26  ushDown).     &&
33d50 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
33d60 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
33d70 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
33d80 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20  em->iCursor,.   
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33da0 20 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e          (pItem->
33db0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
33dc0 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20  _OUTER)!=0).    
33dd0 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
33de0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
33df0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
33e00 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
33e10 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
33e20 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
33e30 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
33e40 20 20 20 28 22 41 66 74 65 72 20 57 48 45 52 45     ("After WHERE
33e50 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
33e60 6e 20 69 6e 74 6f 20 73 75 62 71 75 65 72 79 20  n into subquery 
33e70 25 64 3a 5c 6e 22 2c 20 70 53 75 62 2d 3e 73 65  %d:\n", pSub->se
33e80 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73  lId));.        s
33e90 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
33ea0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
33eb0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
33ed0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
33ee0 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68  ,pParse,p,("Push
33ef0 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62  -down not possib
33f00 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  le\n"));.    }..
33f10 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
33f20 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
33f30 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
33f40 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
33f50 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
33f60 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
33f70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
33f80 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75  implement the su
33f90 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20  bquery.    **.  
33fa0 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72    ** The subquer
33fb0 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  y is implemented
33fc0 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
33fd0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
33fe0 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61   is.    ** guara
33ff0 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20  nteed to be the 
34000 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74  outer loop (so t
34010 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
34020 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a  need to be.    *
34030 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20  * computed more 
34040 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a  than once).    *
34050 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41  *.    ** TODO: A
34060 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72  re there other r
34070 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31  easons beside (1
34080 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f  ) to use a co-ro
34090 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70  utine.    ** imp
340a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20  lementation?.   
340b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30   */.    if( i==0
340c0 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
340d0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
340e0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62          || (pTab
340f0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f  List->a[1].fg.jo
34100 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c  intype&(JT_LEFT|
34110 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20  JT_CROSS))!=0)  
34120 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b  /* (1) */.    ){
34130 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
34140 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
34150 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
34160 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
34170 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
34180 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
34190 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
341a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
341b0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
341c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
341d0 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20  r(v)+1;.     .  
341e0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
341f0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
34200 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
34210 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
34220 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
34230 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
34240 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
34250 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
34260 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
34270 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34280 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
34290 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
342a0 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
342b0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
342c0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
342d0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
342e0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
342f0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
34300 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
34310 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22   "CO-ROUTINE %u"
34320 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b  , pSub->selId));
34330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
34340 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
34350 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
34360 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
34370 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
34380 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
34390 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61     pItem->fg.via
343a0 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
343b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
343c0 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
343d0 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
343e0 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
343f0 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  e(v, pItem->regR
34400 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71  eturn);.      sq
34410 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
34420 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b  e(v, addrTop-1);
34430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
34440 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
34450 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
34460 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  se{.      /* Gen
34470 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
34480 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c  ne that will fil
34490 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  l an ephemeral t
344a0 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20  able with.      
344b0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
344c0 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e  f this subquery.
344d0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
344e0 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a  lSub will point.
344f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
34500 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67  address of the g
34510 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74  enerated subrout
34520 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67  ine.  pItem->reg
34530 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  Return.      ** 
34540 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c  is a register al
34550 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
34560 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
34570 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20  eturn address.  
34580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
34590 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20   topAddr;.      
345a0 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30  int onceAddr = 0
345b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41  ;.      int retA
345c0 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63  ddr;.      struc
345d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
345e0 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61  pPrior;..      a
345f0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
34600 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
34610 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
34620 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
34630 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
34640 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
34650 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34660 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
34670 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
34680 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
34690 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
346a0 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  dr+1;.      if( 
346b0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
346c0 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  elated==0 ){.   
346d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
346e0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63  ubquery is not c
346f0 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66  orrelated and if
34700 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69   we are not insi
34710 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  de of.        **
34720 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e   a trigger, then
34730 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
34740 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
34750 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ue of the subque
34760 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ry.        ** on
34770 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ce. */.        o
34780 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65  nceAddr = sqlite
34790 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
347a0 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
347b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
347c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
347d0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
347e0 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
347f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
34800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34810 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
34820 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
34830 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
34840 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
34850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34860 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66   pPrior = isSelf
34870 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73  JoinView(pTabLis
34880 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20  t, pItem);.     
34890 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20   if( pPrior ){. 
348a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
348b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
348c0 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69  penDup, pItem->i
348d0 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  Cursor, pPrior->
348e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
348f0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
34900 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
34910 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53          pSub->nS
34920 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
34930 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c  r->pSelect->nSel
34940 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65  ectRow;.      }e
34950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
34960 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
34970 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
34980 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
34990 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
349a0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
349b0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d  n((pParse, 1, "M
349c0 41 54 45 52 49 41 4c 49 5a 45 20 25 75 22 2c 20  ATERIALIZE %u", 
349d0 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSub->selId));. 
349e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
349f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
34a00 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
34a10 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e   }.      pItem->
34a20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
34a30 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
34a40 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
34a50 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
34a60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34a70 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
34a80 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
34a90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34aa0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
34ab0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
34ac0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34ad0 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
34ae0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34af0 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
34b00 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
34b10 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
34b20 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
34b30 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
34b40 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
34b50 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
34b60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
34b70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
34b80 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
34b90 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
34ba0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
34bb0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
34bc0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
34bd0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
34be0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
34bf0 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
34c00 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
34c10 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
34c20 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
34c30 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
34c40 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
34c50 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
34c60 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
34c70 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
34c80 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
34c90 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
34ca0 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
34cb0 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
34cc0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
34cd0 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
34ce0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
34cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
34d00 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
34d10 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
34d20 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
34d30 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
34d40 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
34d50 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
34d60 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
34d70 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
34d80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
34d90 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
34da0 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
34db0 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
34dc0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
34dd0 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
34de0 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
34df0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
34e00 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
34e10 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
34e20 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
34e30 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
34e40 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
34e50 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
34e60 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
34e70 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
34e80 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
34e90 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
34ea0 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
34eb0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34ec0 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
34ed0 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
34ee0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
34ef0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
34f00 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
34f10 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
34f20 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
34f30 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
34f40 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
34f50 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
34f60 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
34f70 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
34f80 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
34f90 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
34fa0 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
34fb0 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
34fc0 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
34fd0 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
34fe0 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
34ff0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
35000 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
35010 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
35020 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
35030 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
35040 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
35050 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
35060 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
35070 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
35080 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
35090 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
350a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
350b0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
350c0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
350d0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
350e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
350f0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
35100 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
35110 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
35120 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
35130 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
35140 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
35150 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
35160 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
35170 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
35180 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
35190 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
351a0 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
351b0 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
351c0 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
351d0 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
351e0 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
351f0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
35200 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
35210 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
35220 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
35230 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
35240 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
35250 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
35260 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
35270 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
35280 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
35290 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
352a0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
352b0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
352c0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
352d0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
352e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
352f0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
35300 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
35310 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
35320 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
35330 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
35340 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
35350 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
35360 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
35370 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
35380 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
35390 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
353a0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
353b0 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
353c0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
353d0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
353e0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
353f0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
35400 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
35410 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
35420 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
35430 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
35440 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
35450 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
35460 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
35470 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
35480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
35490 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
354a0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
354b0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
354c0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
354d0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
354e0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
354f0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
35500 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
35510 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
35520 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
35530 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
35540 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
35550 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
35560 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
35570 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
35580 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
35590 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
355a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
355b0 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
355c0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
355d0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
355e0 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
355f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
35600 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35610 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
35620 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
35630 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
35640 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
35650 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
35660 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
35670 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
35680 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
35690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
356a0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
356b0 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
356c0 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
356d0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
356e0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
356f0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
35700 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35710 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
35720 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
35730 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
35740 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
35750 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
35760 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
35770 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
35780 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
35790 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
357a0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
357b0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
357c0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
357d0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
357e0 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
357f0 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
35800 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
35810 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
35820 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
35830 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
35840 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
35850 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
35860 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
35870 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
35880 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
35890 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
358a0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
358b0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
358c0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
358d0 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
358e0 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
358f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
35900 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
35910 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
35920 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
35930 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
35940 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
35950 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
35960 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
35970 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
35980 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
35990 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
359a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
359b0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
359c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
359d0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
359e0 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
359f0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
35a00 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35a10 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
35a20 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
35a30 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
35a40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
35a50 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
35a60 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
35a70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
35a80 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
35a90 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
35aa0 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
35ab0 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
35ac0 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
35ad0 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
35ae0 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
35af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b00 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61      | (p->selFla
35b10 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
35b20 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  it);.#ifndef SQL
35b30 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
35b40 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  UNC.    Window *
35b50 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20  pWin = p->pWin; 
35b60 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77       /* Master w
35b70 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72  indow object (or
35b80 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66   NULL) */.    if
35b90 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( pWin ){.      
35ba0 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
35bb0 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57  eInit(pParse, pW
35bc0 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
35bd0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48  f.    assert( WH
35be0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53  ERE_USE_LIMIT==S
35bf0 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a  F_FixedLimit );.
35c00 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
35c10 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
35c20 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54  . */.    SELECTT
35c30 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
35c40 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
35c50 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
35c60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35c70 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
35c80 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
35c90 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cb0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
35cc0 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
35cd0 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  , p->nSelectRow)
35ce0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
35cf0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
35d00 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
35d10 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
35d20 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
35d30 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
35d40 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
35d50 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
35d60 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
35d70 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
35d80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
35d90 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
35da0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
35db0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
35dc0 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
35dd0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
35de0 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
35df0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
35e00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
35e10 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
35e20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35e30 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35e40 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
35e50 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c  );.      sSort.l
35e60 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71 6c  abelOBLopt = sql
35e70 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42 79  ite3WhereOrderBy
35e80 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70 57  LimitOptLabel(pW
35e90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
35ea0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
35eb0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35ec0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
35ed0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35ee0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
35ef0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
35f00 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
35f10 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
35f20 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
35f30 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
35f40 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
35f50 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
35f60 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
35f70 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
35f80 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
35f90 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
35fa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
35fb0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35fc0 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
35fd0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
35fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35ff0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
36000 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
36010 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
36020 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
36030 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66  t==pEList );.#if
36040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36050 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
36060 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
36070 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20    int addrGosub 
36080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
36090 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
360a0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 20        int iCont 
360b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
360c0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
360d0 20 20 20 20 20 20 69 6e 74 20 69 42 72 65 61 6b        int iBreak
360e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
360f0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
36100 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47 6f  .      int regGo
36110 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  sub = ++pParse->
36120 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nMem;..      sql
36130 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
36140 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
36150 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
36160 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20 20  addrGosub);..   
36170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36180 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
36190 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
361a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
361b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
361c0 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20  drGosub);.      
361d0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
361e0 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70 20  (v, "inner-loop 
361f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
36200 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c       sSort.label
36210 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20 20  OBLopt = 0;.    
36220 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
36230 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
36240 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
36250 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e  nct, pDest, iCon
36260 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
36270 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36280 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
36290 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
362a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
362b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f  OP_Return, regGo
362c0 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65  sub);.      Vdbe
362d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
362e0 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72   inner-loop subr
362f0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20  outine"));.     
36300 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
36310 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
36320 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  ak);.    }else.#
36330 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36340 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
36350 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f  */.    {.      /
36360 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
36370 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
36380 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  /.      selectIn
36390 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
363a0 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  p, -1, &sSort, &
363b0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
363c0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
363d0 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
363e0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
363f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
36400 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
36410 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20  pWInfo));..     
36420 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
36430 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
36440 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
36450 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
36460 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
36470 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
36480 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
36490 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
364a0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
364b0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
364c0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
364d0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
364e0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
364f0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
36500 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
36510 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
36520 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
36530 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
36540 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
36550 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
36560 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
36570 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
36580 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
36590 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
365a0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
365b0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
365c0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
365d0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
365e0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
365f0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
36600 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
36610 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
36620 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
36630 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
36640 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
36650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36660 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
36670 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
36680 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
36690 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
366a0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
366b0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
366c0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
366d0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
366e0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
366f0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
36700 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
36710 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
36720 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
36730 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
36740 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
36750 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
36760 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
36770 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
36780 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
36790 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
367a0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
367b0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
367c0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
367d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
367e0 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
367f0 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
36800 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
36810 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
36820 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
36830 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
36840 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
36850 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
36860 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
36870 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
36880 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
36890 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
368a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
368b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
368c0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
368d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
368e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
368f0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
36900 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
36910 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
36920 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
36930 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
36940 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
36950 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
36960 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
36970 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
36980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36990 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
369a0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
369b0 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
369c0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
369d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
369e0 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
369f0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
36a00 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 66==sqlite3Lo
36a10 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20  gEst(100) );.   
36a20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
36a30 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65  tRow>66 ) p->nSe
36a40 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20  lectRow = 66;.  
36a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
36a60 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
36a70 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20  3LogEst(1) );.  
36a80 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
36a90 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  w = 0;.    }..  
36aa0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
36ab0 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
36ac0 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
36ad0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
36ae0 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
36af0 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
36b00 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
36b10 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
36b20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
36b30 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
36b40 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
36b50 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
36b60 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
36b70 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
36b80 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
36b90 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
36ba0 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
36bb0 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a   BY might use a.
36bc0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
36bd0 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65  index that cause
36be0 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f  s rows to be gro
36bf0 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73  uped together as
36c00 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
36c10 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
36c20 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72  y sorted. Either
36c30 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65   way, record the
36c40 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20   fact that the. 
36c50 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61     ** ORDER BY a
36c60 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
36c70 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ses are the same
36c80 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
36c90 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a  orderByGrp.    *
36ca0 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
36cb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
36cc0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
36cd0 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70  GroupBy, sSort.p
36ce0 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
36cf0 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79  ){.      orderBy
36d00 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Grp = 1;.    }. 
36d10 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
36d20 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
36d30 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
36d40 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
36d50 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
36d60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
36d70 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
36d80 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
36d90 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
36da0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
36db0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
36dc0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
36dd0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
36de0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
36df0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
36e00 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
36e10 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
36e20 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
36e30 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
36e40 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
36e50 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
36e60 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
36e70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
36e80 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e  st;.    sNC.uNC.
36e90 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
36ea0 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e  Info;.    VVA_ON
36eb0 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  LY( sNC.ncFlags 
36ec0 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29  = NC_UAggInfo; )
36ed0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
36ee0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
36ef0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
36f00 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
36f10 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
36f20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
36f30 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
36f40 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
36f50 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
36f60 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
36f70 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
36f80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
36f90 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
36fa0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
36fb0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
36fc0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
36fd0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
36fe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36ff0 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
37000 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  re );.        as
37010 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d 70  sert( pHaving==p
37020 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20 20  ->pHaving );.   
37030 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47 72       assert( pGr
37040 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70  oupBy==p->pGroup
37050 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  By );.        ha
37060 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
37070 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
37080 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
37090 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
370a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
370b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
370c0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
370d0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
370e0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
370f0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
37100 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47  n;.    if( p->pG
37110 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e  roupBy==0 && p->
37120 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73 41  pHaving==0 && sA
37130 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20  ggInfo.nFunc==1 
37140 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ){.      minMaxF
37150 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
37160 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  y(db, sAggInfo.a
37170 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26  Func[0].pExpr, &
37180 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b  pMinMaxOrderBy);
37190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
371a0 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57    minMaxFlag = W
371b0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
371c0 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MAL;.    }.    f
371d0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
371e0 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
371f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
37200 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
37210 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
37220 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
37230 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
37240 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
37250 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
37260 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
37270 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
37280 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37290 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
372a0 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
372b0 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
372c0 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
372d0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
372e0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
372f0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
37300 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
37310 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69  o select_end;.#i
37320 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
37330 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
37340 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
37350 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
37360 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
37370 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
37380 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
37390 65 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61  er aggregate ana
373a0 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
373b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
373c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
373d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
373e0 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
373f0 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
37400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37410 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63  bugPrintf("agg-c
37420 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25  olumn[%d] iMem=%
37430 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37440 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
37450 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  Col[ii].iMem);. 
37460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
37470 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
37480 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
37490 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
374a0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d   }.      for(ii=
374b0 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
374c0 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Func; ii++){.   
374d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
374e0 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e  gPrintf("agg-fun
374f0 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e  c[%d]: iMem=%d\n
37500 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
37510 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  i, sAggInfo.aFun
37520 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  c[ii].iMem);.   
37530 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
37540 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67  ViewExpr(0, sAgg
37550 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70  Info.aFunc[ii].p
37560 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
37570 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
37580 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
37590 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
375a0 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
375b0 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
375c0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
375d0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
375e0 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
375f0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
37600 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
37610 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
37620 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
37630 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
37640 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
37650 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
37660 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
37670 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
37680 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
37690 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
376a0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
376b0 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
376c0 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
376d0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
376e0 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
376f0 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
37700 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
37710 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
37720 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
37730 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
37740 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
37750 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
37760 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
37770 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
37780 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
37790 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
377a0 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
377b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
377c0 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
377d0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
377e0 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
377f0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
37800 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
37810 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
37820 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
37830 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
37840 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
37850 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
37860 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
37870 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
37880 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
37890 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
378a0 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
378b0 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
378c0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
378d0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
378e0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
378f0 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
37900 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
37910 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
37920 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
37930 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
37940 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
37950 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
37960 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
37970 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
37980 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
37990 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
379a0 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
379b0 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
379c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
379d0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
379e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
379f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
37a00 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67 67 49  pGroupBy,0,sAggI
37a10 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
37a20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
37a30 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
37a40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
37a50 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
37a60 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
37a70 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
37a80 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
37a90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
37aa0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
37ab0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
37ac0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
37ad0 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
37ae0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
37af0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
37b00 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
37b10 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
37b20 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
37b30 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
37b40 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
37b50 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
37b60 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
37b70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37b80 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
37b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
37ba0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
37bb0 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
37bc0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37bd0 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
37be0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
37bf0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
37c00 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
37c10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
37c20 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
37c30 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
37c40 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
37c50 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
37c60 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
37c70 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
37c80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
37c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37ca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
37cb0 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
37cc0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
37cd0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
37ce0 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
37cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37d00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
37d10 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
37d20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
37d30 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
37d40 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
37d50 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
37d60 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
37d70 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
37d80 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
37d90 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
37da0 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
37db0 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
37dc0 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
37dd0 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
37de0 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
37df0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
37e00 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
37e10 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
37e20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
37e30 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
37e40 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
37e50 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
37e60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37e70 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
37e80 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
37e90 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
37ea0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
37eb0 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
37ec0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
37ed0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
37ee0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
37ef0 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
37f00 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
37f10 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
37f20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
37f30 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
37f40 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
37f50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
37f60 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
37f70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
37f80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
37f90 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
37fa0 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
37fb0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
37fc0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
37fd0 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
37fe0 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
37ff0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
38000 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
38010 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
38020 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
38030 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
38040 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
38050 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
38060 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
38070 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
38080 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
38090 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
380a0 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
380b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
380c0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
380d0 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
380e0 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
380f0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
38100 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
38110 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
38120 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
38130 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
38140 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
38150 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
38160 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
38170 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
38180 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
38190 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
381a0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
381b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
381c0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
381d0 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
381e0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
381f0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
38200 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
38210 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
38220 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
38230 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
38240 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
38250 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
38260 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
38270 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
38280 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
38290 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
382a0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
382b0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
382c0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
382d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
382e0 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
382f0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
38300 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
38310 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
38320 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
38330 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
38340 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
38350 6f 72 74 65 72 43 6f 6c 75