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

Artifact eabefcb57edafcac6baeaec83289816e9409a23957b5a2d3efe1265f597ce6bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   && p->x.pList )
3380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
3390: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
33b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
33c0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
33d0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
33e0: 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  xpr, iTable);.  
33f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3400: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
3410: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
3420: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
3430: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64  ;.  } .}../* Und
3440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65  o the work of se
3450: 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e  tJoinExpr().  In
3460: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3470: 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20  tree p, convert 
3480: 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68  every.** term th
3490: 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  at is marked wit
34a0: 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e  h EP_FromJoin an
34b0: 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  d iRightJoinTabl
34c0: 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a  e==iTable into.*
34d0: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65  * an ordinary te
34e0: 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  rm that omits th
34f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61  e EP_FromJoin ma
3500: 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68  rk..**.** This h
3510: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45  appens when a LE
3520: 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c  FT JOIN is simpl
3530: 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72  ified into an or
3540: 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a  dinary JOIN..*/.
3550: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65  static void unse
3560: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3570: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3580: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
35a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
35b0: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69  Join).     && (i
35c0: 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52  Table<0 || p->iR
35d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
35e0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
35f0: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
3600: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3620: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3630: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3640: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3660: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3670: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3680: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3690: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36a0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36c0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36d0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
36e0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
36f0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3720: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3730: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3740: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3750: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3760: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3770: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3780: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
3790: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
37a0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
37b0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
37c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
37d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
37e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
37f0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3800: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3820: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3830: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3840: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3850: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3860: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3870: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3880: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
3890: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
38a0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
38b0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
38c0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
38d0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
38e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
38f0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3900: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3910: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3920: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3930: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3940: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3950: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3960: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3990: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
39a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39b0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
39c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
39d0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
39e0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a00: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3a10: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3a50: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3a60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3a70: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3a80: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3a90: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ab0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3ac0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
3ae0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3af0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3b00: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3b10: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3b20: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3b30: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3b40: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3b50: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3b60: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3b70: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3b80: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3b90: 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d  ER(pLeft->pTab==
3ba0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3bb0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
3bc0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3bd0: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3be0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3bf0: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3c00: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3c10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3c20: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3c30: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3c40: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3c50: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3c60: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
3c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c80: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
3c90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
3ca0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
3cb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
3cc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cf0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3d00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3d10: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3d20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3d30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d60: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
3d70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3d80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
3da0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
3db0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3dc0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3dd0: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3de0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3df0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3e00: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3e10: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3e20: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3e30: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3e40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3e50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3e60: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3e70: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3e80: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3e90: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
3ea0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3eb0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3ec0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3ed0: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3f00: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3f20: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3f30: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f40: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3f50: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3f60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3f70: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
3f80: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3fb0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
3fc0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3fd0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3fe0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4010: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
4020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4030: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
4040: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
4050: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
4060: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
4070: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
4080: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
4090: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
40a0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
40b0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
40c0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
40d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
40e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5720: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
5730: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5740: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
5750: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
5780: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
5790: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
57a0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
57b0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
57c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
57d0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
57e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
57f0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
5800: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
5810: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
5820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5830: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5840: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
5850: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
5860: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69   nData);.  }.  i
5870: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
5880: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
5890: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
58a0: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
58b0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
58c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
58d0: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
58e0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
58f0: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
5900: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
5910: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
5920: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
5930: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
5940: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5950: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
5960: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
5970: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
5980: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
5990: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
59a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
59b0: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
59c0: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
59d0: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
59e0: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
59f0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
5a00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
5a10: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
5a20: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
5a30: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
5a40: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
5a50: 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  );.    regPrevKe
5a60: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
5a70: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5a80: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
5a90: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
5aa0: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
5ab0: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
5ac0: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
5ad0: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5af0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
5b00: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5b10: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
5b20: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
5b50: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
5b60: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
5b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5ba0: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
5bb0: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
5bc0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5bd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5be0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
5bf0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
5c00: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
5c10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5c20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
5c30: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
5c40: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
5c50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5c60: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
5c70: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
5c80: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
5c90: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
5ca0: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5cd0: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
5ce0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
5cf0: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
5d00: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
5d10: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
5d20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5d30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
5d40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
5d50: 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64  arse,pSort->pOrd
5d60: 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20  erBy,nOBSat,.   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c          pKI->nAl
5da0: 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79  lField-pKI->nKey
5db0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
5dc0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
5dd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5e00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
5e10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
5e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5e30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
5e40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
5e50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5e60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
5e70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
5e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ea0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
5eb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
5ec0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
5ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ee0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
5ef0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5f00: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5f10: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5f40: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5f50: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5f60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5f70: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5f90: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5fb0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5fc0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
5fd0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
5fe0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
5ff0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6000: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
6010: 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a    if( iLimit ){.
6020: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
6030: 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73 20  oint the values 
6040: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72 74  for the new sort
6050: 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  er entry are sto
6060: 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61 6e  red.    ** in an
6070: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
6080: 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20 74  ers. They need t
6090: 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69 6e  o be composed in
60a0: 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20 20  to a record.    
60b0: 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64 20  ** and inserted 
60c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  into the sorter 
60d0: 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
60e0: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
60f0: 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  y.    ** less th
6100: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
6110: 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68 65  items or (b) the
6120: 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 73   new record is s
6130: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20  maller than .   
6140: 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20   ** the largest 
6150: 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79  record currently
6160: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   in the sorter. 
6170: 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20 61  If (b) is true a
6180: 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  nd there.    ** 
6190: 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d 49  are already LIMI
61a0: 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69  T+OFFSET items i
61b0: 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64 65  n the sorter, de
61c0: 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  lete the largest
61d0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62 65  .    ** entry be
61e0: 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
61f0: 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69 73  he new one. This
6200: 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20 6e   way there are n
6210: 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  ever more .    *
6220: 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  * than LIMIT+OFF
6230: 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65  SET items in the
6240: 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a 0a   sorter..    **.
6250: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 65      ** If the ne
6260: 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f  w record does no
6270: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 73  t need to be ins
6280: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  erted into the s
6290: 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a 75  orter,.    ** ju
62a0: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
62b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
62c0: 6c 6f 6f 70 2e 20 49 66 20 74 68 65 20 70 53 6f  loop. If the pSo
62d0: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 0a  rt->labelOBLopt.
62e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
62f0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
6300: 74 20 69 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  t is a label of 
6310: 77 68 65 72 65 20 74 6f 20 6a 75 6d 70 2e 20 20  where to jump.  
6320: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
6330: 2a 20 6a 75 73 74 20 62 79 70 61 73 73 20 74 68  * just bypass th
6340: 65 20 72 6f 77 20 69 6e 73 65 72 74 20 6c 6f 67  e row insert log
6350: 69 63 2e 20 20 53 65 65 20 74 68 65 20 68 65 61  ic.  See the hea
6360: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
6370: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
6380: 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d  3WhereOrderByLim
6390: 69 74 4f 70 74 4c 61 62 65 6c 28 29 20 66 75 6e  itOptLabel() fun
63a0: 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
63b0: 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20 20 20 20 2a  onal info..    *
63c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d  /.    int iCsr =
63d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6400: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  NotZero, iLimit,
6410: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6420: 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20  entAddr(v)+4);. 
6430: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6440: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6460: 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a  Last, iCsr, 0);.
6470: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
6480: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6490: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20  (v, OP_IdxLE,.  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
64c0: 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  Csr, 0, regBase+
64d0: 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f  nOBSat, nExpr-nO
64e0: 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43  BSat);.    VdbeC
64f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6520: 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iCsr);.  }.  if(
6530: 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b   regRecord==0 ){
6540: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
6550: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
6560: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
6570: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
6580: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20  e, nBase);.  }. 
6590: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
65a0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65b0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
65c0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
65d0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
65e0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
65f0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
6600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6610: 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  nt(v, op, pSort-
6620: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
6630: 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6650: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
6660: 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66  se-nOBSat);.  if
6670: 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 73  ( iSkip ){.    s
6680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6690: 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20  P2(v, iSkip,.   
66a0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62        pSort->lab
66b0: 65 6c 4f 42 4c 6f 70 74 20 3f 20 70 53 6f 72 74  elOBLopt ? pSort
66c0: 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3a 20  ->labelOBLopt : 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
66e0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a  ntAddr(v));.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6700: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
6710: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
6720: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
6730: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6750: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6760: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6770: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6780: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6790: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
67a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
67b0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
67c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
67d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
67e0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
67f0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
6800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6810: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6820: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6830: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
6840: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6860: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6880: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6890: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
68a0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
68b0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
68c0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
68d0: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
68e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
68f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
6900: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
6910: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
6920: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
6930: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
6940: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6950: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6960: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6970: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6980: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6990: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
69a0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
69b0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
69c0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
69d0: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
69e0: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
69f0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6a00: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6a10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6a20: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6a30: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6a60: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6a70: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6a80: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6a90: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6aa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6ab0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6ac0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ae0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6af0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6b10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6b20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6b30: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6b40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6b50: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b60: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6b80: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6b90: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6ba0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6bb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6be0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6c10: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6c20: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6c50: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6c80: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6ca0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6cd0: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6ce0: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6cf0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6d00: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6d10: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6d20: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6d30: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6d40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6d50: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6d60: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6d70: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6d80: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6d90: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6da0: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6db0: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6dc0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6dd0: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6de0: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6e00: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6e10: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6e30: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6e40: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6e50: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6e60: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6e70: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6e80: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6e90: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6ea0: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6eb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6ec0: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6ed0: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6ee0: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6ef0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6f00: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6f10: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6f20: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6f30: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6f40: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
6f50: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
6f60: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
6f70: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
6f80: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
6f90: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
6fa0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
6fb0: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
6fc0: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
6fd0: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
6fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
6ff0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
7000: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
7010: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7020: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
7030: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
7040: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7050: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7060: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7070: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7080: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7090: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
70a0: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
70b0: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
70c0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
70d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
70e0: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
70f0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
7100: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
7110: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
7120: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
7130: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
7140: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7150: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7160: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7170: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7180: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7190: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
71a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
71b0: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
71c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
71f0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
7200: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
7220: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
7230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7240: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7260: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7270: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7280: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
72a0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
72b0: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
72c0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
72d0: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
72e0: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
72f0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
7300: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7310: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7320: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
7340: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7350: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7360: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7370: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7380: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7390: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
73a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
73b0: 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
73c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
73d0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
73e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
73f0: 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72 74   pTab && !IsVirt
7400: 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20  ual(pTab).      
7410: 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b   && (pTab->aCol[
7420: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
7430: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
7440: 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20  AG_SORTERREF).  
7450: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
7460: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
7470: 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b  r(j=0; j<nDefer;
7480: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7490: 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66   if( pSort->aDef
74a0: 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70  er[j].iCsr==pExp
74b0: 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  r->iTable ) brea
74c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
74d0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66       if( j==nDef
74e0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
74f0: 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61  if( nDefer==Arra
7500: 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65  ySize(pSort->aDe
7510: 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  fer) ){.        
7520: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7530: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7540: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
7550: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
7560: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
7570: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
7580: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pk = 0;.        
7590: 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
75a0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
75b0: 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73           pPk = s
75c0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
75d0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
75e0: 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20             nKey 
75f0: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7610: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
7620: 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b  0; k<nKey; k++){
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
7640: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
7650: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7660: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30   TK_COLUMN, 0, 0
7670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7680: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
76a0: 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  w->iTable = pExp
76b0: 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
76d0: 3e 79 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  >y.pTab = pExpr-
76e0: 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
76f0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
7700: 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70  Column = pPk ? p
7710: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  Pk->aiColumn[k] 
7720: 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  : -1;.          
7730: 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73        pExtra = s
7740: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7750: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78  pend(pParse, pEx
7760: 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  tra, pNew);.    
7770: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
77a0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62  fer[nDefer].pTab
77b0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
77c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
77d0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
77e0: 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72  er].iCsr = pExpr
77f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
7800: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
7810: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79  fer[nDefer].nKey
7820: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20   = nKey;.       
7830: 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20       nDefer++;. 
7840: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
7860: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
7870: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7880: 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e  }.  }.  pSort->n
7890: 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66  Defer = (u8)nDef
78a0: 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d  er;.  *ppExtra =
78b0: 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69   pExtra;.}.#endi
78c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
78d0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
78e0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
78f0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
7900: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
7910: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
7920: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
7930: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
7940: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
7950: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
7960: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
7970: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
7980: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
7990: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
79a0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
79b0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
79c0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
79d0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
79e0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
79f0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7a00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7a10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7a20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7a30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
7a40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
7a50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
7a60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
7a70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7a80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7a90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
7aa0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
7ab0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
7ac0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
7ad0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7af0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
7b00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
7b10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
7b20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7b30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
7b40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7b50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
7b60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
7b70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
7b80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
7b90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7ba0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
7bb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
7bc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
7bd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
7be0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
7bf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
7c00: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
7c10: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
7c20: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
7c30: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
7c40: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
7c50: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c60: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
7c70: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
7c80: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7c90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7ca0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
7cb0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
7cc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7cd0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
7ce0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
7cf0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
7d00: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
7d10: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
7d20: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
7d30: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
7d40: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
7d50: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7d60: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
7d70: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
7d80: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
7db0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
7dc0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
7dd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7de0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
7df0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
7e00: 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66   */.  RowLoadInf
7e10: 6f 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20  o sRowLoadInfo; 
7e20: 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65    /* Info for de
7e30: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
7e40: 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  ng */..  /* Usua
7e50: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
7e60: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7e70: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7e80: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7e90: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7ea0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7eb0: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7ec0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7ed0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7ee0: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7ef0: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7f00: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
7f10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
7f20: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
7f30: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
7f40: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
7f50: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
7f60: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7f70: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7f80: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7f90: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7fa0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7fb0: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7fd0: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
7fe0: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
7ff0: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
8000: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
8020: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
8030: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
8040: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
8050: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
8060: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
8070: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
8080: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
8090: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
80a0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
80b0: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
80c0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
80d0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
80e0: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
80f0: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
8100: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
8110: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
8120: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
8130: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
8140: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
8150: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
8160: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
8170: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
8180: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
8190: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
81a0: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
81b0: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
81c0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
81d0: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
81e0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
81f0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
8200: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
8210: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
8220: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
8230: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
8240: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8250: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
8260: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
8270: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
8280: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
8290: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
82a0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
82b0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
82c0: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
82d0: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
82e0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
82f0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
8300: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
8310: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
8320: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
8330: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
8340: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
8350: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
8360: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
8370: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
8380: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
8390: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
83a0: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
83b0: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
83c0: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
83d0: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
83e0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
83f0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
8400: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
8410: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
8420: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
8430: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
8440: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
8450: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8460: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
8470: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
8480: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
8490: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
84a0: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
84b0: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
84c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
84d0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
84e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
84f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8510: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
8520: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
8530: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
8540: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
8550: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
8560: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
8570: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
8580: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
8590: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
85a0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
85b0: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
85c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
85d0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
85e0: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
85f0: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
8600: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
8610: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
8620: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
8630: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
8640: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8650: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20  u8 ecelFlags;   
8660: 20 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e   /* "ecel" is an
8670: 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66   abbreviation of
8680: 20 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69   "ExprCodeExprLi
8690: 73 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  st" */.    ExprL
86a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
86b0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
86c0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
86d0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
86e0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
86f0: 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   ){.      ecelFl
8700: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45  ags = SQLITE_ECE
8710: 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65  L_DUP;.    }else
8720: 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67  {.      ecelFlag
8730: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 0;.    }.   
8740: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61   if( pSort && ha
8750: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20  sDistinct==0 && 
8760: 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d  eDest!=SRT_Ephem
8770: 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52  Tab && eDest!=SR
8780: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
8790: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   /* For each exp
87a0: 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45  ression in p->pE
87b0: 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63  List that is a c
87c0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
87d0: 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sion in.      **
87e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
87f0: 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72  ause (pSort->pOr
8800: 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20  derBy), set the 
8810: 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20  associated .    
8820: 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c    ** iOrderByCol
8830: 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f   value to one mo
8840: 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65  re than the inde
8850: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
8860: 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  Y .      ** expr
8870: 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
8880: 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20  e sort-key that 
8890: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
88a0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
88b0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c        ** This al
88c0: 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69  lows the p->pELi
88d0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
88e0: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
88f0: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
8900: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
8910: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
8920: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
8930: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
8940: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
8950: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
8960: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
8970: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
8980: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
8990: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
89a0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
89b0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
89c0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
89d0: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
89e0: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
89f0: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8a00: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8a10: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8a20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8a50: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8a60: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
8a70: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
8a80: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
8a90: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
8aa0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
8ab0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8ac0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8ad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8ae0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8af0: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8b00: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8b10: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8b20: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8b30: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8b40: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8b50: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
8b60: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
8b70: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
8b80: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
8b90: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
8ba0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
8bb0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8bc0: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8bd0: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8be0: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8bf0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8c00: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8c10: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8c20: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8c30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8c40: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8c50: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
8c60: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
8c70: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
8c80: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
8c90: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8ca0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8cb0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8cc0: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8cd0: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8ce0: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8cf0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8d00: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8d10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8d20: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
8d30: 2a 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74  * Adjust nResult
8d40: 43 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Col to account f
8d50: 6f 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  or columns that 
8d60: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20  are omitted.    
8d70: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f    ** from the so
8d80: 72 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69  rter by the opti
8d90: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  mizations in thi
8da0: 73 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20  s branch */.    
8db0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
8dc0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  List;.      for(
8dd0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8de0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8df0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8e00: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8e10: 79 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51  yCol>0.#ifdef SQ
8e20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
8e30: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
8e40: 20 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74         || pEList
8e50: 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  ->a[i].bSorterRe
8e60: 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  f.#endif.       
8e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52   ){.          nR
8e80: 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20  esultCol--;.    
8e90: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
8ea0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
8eb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
8ec0: 63 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b  case( regOrig );
8ed0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ee0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
8ef0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8f00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  e( eDest==SRT_Me
8f10: 6d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  m );.      testc
8f20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f30: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
8f40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
8f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f70: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
8f80: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8f90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8fa0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8fb0: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8fc0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8fd0: 20 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49   }.    sRowLoadI
8fe0: 6e 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20  nfo.regResult = 
8ff0: 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73  regResult;.    s
9000: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c  RowLoadInfo.ecel
9010: 46 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67  Flags = ecelFlag
9020: 73 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  s;.#ifdef SQLITE
9030: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
9040: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52  EFERENCES.    sR
9050: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72  owLoadInfo.pExtr
9060: 61 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20  a = pExtra;.    
9070: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67  sRowLoadInfo.reg
9080: 45 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65  ExtraResult = re
9090: 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c  gResult + nResul
90a0: 74 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  tCol;.    if( pE
90b0: 78 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f  xtra ) nResultCo
90c0: 6c 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  l += pExtra->nEx
90d0: 70 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  pr;.#endif.    i
90e0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20  f( p->iLimit.   
90f0: 20 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20    && (ecelFlags 
9100: 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
9110: 49 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20  ITREF)!=0 .     
9120: 26 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a  && nPrefixReg>0.
9130: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
9140: 65 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b  ert( pSort!=0 );
9150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
9160: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  asDistinct==0 );
9170: 0a 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44  .      pSort->pD
9180: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d  eferredRowLoad =
9190: 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a   &sRowLoadInfo;.
91a0: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
91b0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
91c0: 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61      innerLoopLoa
91d0: 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20  dRow(pParse, p, 
91e0: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a  &sRowLoadInfo);.
91f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9200: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
9210: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
9220: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
9230: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
9240: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
9250: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
9260: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
9270: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
9280: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
9290: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
92a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
92b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
92c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
92d0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
92e0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
92f0: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
9300: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
9310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
9320: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
9330: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
9340: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
9350: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
9360: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
9370: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
9380: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
9390: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
93a0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
93b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
93c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
93d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
93e0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
93f0: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
9400: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9410: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9420: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
9430: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
9440: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
9450: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
9460: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
9470: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
9480: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
9490: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
94a0: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
94b0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
94c0: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
94d0: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
94e0: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
94f0: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
9500: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
9510: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
9520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
9530: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
9540: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
9550: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
9560: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9580: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
9590: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
95b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
95c0: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
95d0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
95e0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
95f0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
9600: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
9610: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
9620: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
9630: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
9640: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9650: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
9660: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
9670: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
9680: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
9690: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
96a0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
96b0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
96c0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
96d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
96e0: 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f   if( i<nResultCo
96f0: 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l-1 ){.         
9700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9710: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
9720: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d  egResult+i, iJum
9730: 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  p, regPrev+i);. 
9740: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
9750: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9780: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9790: 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Eq, regResult+i
97a0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  , iContinue, reg
97b0: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
97c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
97d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
97e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
97f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
9800: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
9810: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
9820: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9840: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
9850: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
9860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
9870: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
9880: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
9890: 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d  iJump || pParse-
98a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
98b0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
98c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
98d0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
98e0: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
98f0: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
9900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9910: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
9920: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
9930: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
9940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9950: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
9960: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
9970: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9980: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9990: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
99a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
99b0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
99c0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
99d0: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
99e0: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
99f0: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
9a00: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
9a10: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
9a20: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
9a30: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
9a40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62  sult);.        b
9a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
9a70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  t==0 ){.      co
9a80: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9a90: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
9aa0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
9ab0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
9ac0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
9ad0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
9ae0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
9af0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
9b00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
9b10: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
9b20: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
9b30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9b40: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
9b50: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
9b60: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
9b70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
9b80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
9b90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
9bc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9bd0: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
9be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bf0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9c00: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9c10: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9c20: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73  ultCol);.      s
9c30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9c40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
9c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
9c70: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
9c80: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
9c90: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
9ca0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
9cb0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
9cc0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
9cd0: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
9ce0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
9cf0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
9d00: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
9d10: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
9d20: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
9d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9d40: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
9d50: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
9d60: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9d70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9d80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9d90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9da0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ND_SELECT */..  
9db0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
9dc0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
9dd0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
9de0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
9df0: 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20  e SRT_Fifo:.    
9e00: 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66  case SRT_DistFif
9e10: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
9e20: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
9e30: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
9e40: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
9e50: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
9e60: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66  ge(pParse, nPref
9e70: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
9e80: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9e90: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
9ec0: 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
9ed0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9ee0: 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65  Fifo );.      te
9ef0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9f00: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
9f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9f30: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9f40: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9f50: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
9f80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f90: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
9fa0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
9fb0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
9fc0: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
9fd0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
9fe0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
9ff0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
a000: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
a010: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
a020: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
a030: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
a040: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
a050: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
a060: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
a070: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
a080: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
a090: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
a0a0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
a0b0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
a0c0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
a0d0: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
a0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
a0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a100: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
a110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a120: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a130: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
a140: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
a150: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a160: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a180: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a190: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
a1a0: 20 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52   r1,regResult,nR
a1b0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a1c0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
a1d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
a1e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
a1f0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a200: 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75   assert( regResu
a210: 6c 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20  lt==regOrig );. 
a220: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
a230: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
a240: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
a250: 69 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20  ixReg, regOrig, 
a260: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
a270: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a280: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
a290: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a2a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
a2d0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
a2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a2f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a300: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a310: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a320: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a330: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
a340: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
a350: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a360: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
a370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a380: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a390: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
a3a0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
a3b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a3c0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
a3d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a3e0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
a3f0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
a400: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
a410: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
a420: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
a430: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
a440: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
a450: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
a460: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
a470: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
a480: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
a490: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
a4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a4b0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a4c0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a4d0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
a4e0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
a4f0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
a500: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
a510: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
a520: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
a530: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
a540: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
a550: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
a560: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
a570: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
a580: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
a590: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
a5a0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
a5b0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
a5c0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
a5d0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a5e0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a5f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a600: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
a610: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
a620: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a630: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a640: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a650: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a660: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
a680: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
a690: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
a6a0: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
a6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6c0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a6d0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
a6e0: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
a6f0: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
a700: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
a710: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a730: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a740: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a750: 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  1, regResult, nR
a760: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a770: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a780: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a790: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
a7a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a7b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
a7c0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
a7d0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
a7e0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
a7f0: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
a800: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
a810: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
a820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a830: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
a840: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
a850: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
a860: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
a870: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
a880: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
a890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a8a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
a8b0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
a8c0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
a8d0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
a8e0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
a8f0: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
a900: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
a910: 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20  y cell or array 
a920: 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  of .    ** memor
a930: 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61  y cells and brea
a940: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61  k out of the sca
a950: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
a960: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a970: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a980: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a990: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
a9a0: 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  <=pDest->nSdst )
a9b0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
a9c0: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
a9d0: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
a9e0: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
a9f0: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
aa00: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
aa10: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
aa20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aa30: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44  ( nResultCol==pD
aa40: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
aa50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
aa60: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
aa70: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
aa80: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
aa90: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
aaa0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
aab0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
aac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
aad0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aaf0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
ab00: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
ab10: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
ab20: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
ab30: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
ab40: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
ab50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
ab60: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
ab70: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ab80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ab90: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
aba0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
abb0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
abc0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
abd0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
abe0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
abf0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
ac00: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
ac10: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72               nPr
ac30: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
ac40: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
ac50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
ac60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ac70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ac80: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
ac90: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
aca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
acb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
acc0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
acd0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
ace0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
acf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad00: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ad10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
ad20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
ad30: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
ad40: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
ad50: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
ad60: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
ad70: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
ad80: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
ad90: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
ada0: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
adb0: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
adc0: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
add0: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
ade0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
adf0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
ae00: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
ae10: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
ae20: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
ae30: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
ae40: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
ae50: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
ae60: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
ae70: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
ae80: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
ae90: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
aea0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
aeb0: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
aec0: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
aed0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
aee0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
aef0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
af00: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
af10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
af20: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
af30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
af40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
af50: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
af60: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
af70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
af80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
af90: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
afa0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
afb0: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
afc0: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
afd0: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
afe0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
aff0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b000: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
b010: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
b020: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
b030: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
b040: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
b050: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
b060: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
b070: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
b080: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
b090: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
b0a0: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
b0b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
b0c0: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
b0d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b0e0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
b0f0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b130: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
b140: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b170: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b180: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
b190: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
b1a0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
b1b0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
b1c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b1e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
b1f0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
b200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b210: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
b220: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
b230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b240: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
b250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b270: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
b2a0: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
b2b0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
b2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2d0: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
b2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b300: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
b310: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
b320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b340: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
b350: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
b360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b370: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b380: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
b390: 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29   r1, r2, nKey+2)
b3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
b3b0: 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64  Test ) sqlite3Vd
b3c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b3d0: 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73  drTest);.      s
b3e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
b400: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b410: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
b420: 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79  pParse, r2, nKey
b430: 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +2);.      break
b440: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
b450: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
b460: 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  E */....#if !def
b470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b480: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
b490: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
b4a0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
b4b0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
b4c0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
b4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
b4e0: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
b4f0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
b500: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
b510: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
b520: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
b530: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
b540: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
b550: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
b560: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
b570: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
b580: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
b590: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
b5a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b5b0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
b5c0: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
b5d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b5e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
b5f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b600: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
b610: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  IT is reached.  
b620: 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20  Except, if.  ** 
b630: 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65  there is a sorte
b640: 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  r, in which case
b650: 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20   the sorter has 
b660: 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a  already limited.
b670: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20    ** the output 
b680: 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69  for us..  */.  i
b690: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70  f( pSort==0 && p
b6a0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
b6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6c0: 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
b6d0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
b6e0: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
b6f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
b700: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
b710: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b720: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
b730: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
b740: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
b750: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
b760: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
b770: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
b780: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
b790: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
b7a0: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e   int nExtra = (N
b7b0: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
b7c0: 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f  Seq*)+1) - sizeo
b7d0: 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b  f(CollSeq*);.  K
b7e0: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
b7f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b800: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49  (db, sizeof(KeyI
b810: 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  nfo) + nExtra);.
b820: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
b830: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
b840: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
b850: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46  X];.    p->nKeyF
b860: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
b870: 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20     p->nAllField 
b880: 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20  = (u16)(N+X);.  
b890: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
b8a0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
b8b0: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
b8c0: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
b8d0: 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61  &p[1], 0, nExtra
b8e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b8f0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
b900: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
b910: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
b920: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
b930: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
b940: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
b950: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
b960: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
b970: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
b980: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
b990: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
b9a0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
b9b0: 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62  e3DbFreeNN(p->db
b9c0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
b9d0: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
b9e0: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
b9f0: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
ba00: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
ba10: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
ba20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
ba30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
ba40: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
ba50: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
ba60: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
ba70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ba80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ba90: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
baa0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
bab0: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
bac0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
bad0: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
bae0: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
baf0: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
bb00: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
bb10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb20: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
bb30: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
bb40: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
bb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
bb60: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
bb70: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
bb80: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
bb90: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bba0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
bbb0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
bbc0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
bbd0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
bbe0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bbf0: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
bc00: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bc10: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
bc20: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
bc30: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
bc40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
bc50: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
bc60: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
bc70: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
bc80: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
bc90: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
bca0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
bcb0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
bcc0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
bcd0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
bce0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
bcf0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bd00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
bd10: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
bd20: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
bd30: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bd40: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bd50: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bd60: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
bd70: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
bd80: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
bd90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
bda0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bdb0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
bdc0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
bdd0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
bde0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
bdf0: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
be00: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
be10: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
be20: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 4b  y.** freed..*/.K
be30: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
be40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
be50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
be60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
be70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
be80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
be90: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
bea0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
beb0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
bec0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
bed0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
bee0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
bef0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
bf00: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
bf10: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
bf20: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
bf30: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
bf40: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
bf50: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
bf60: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
bf70: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
bf80: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
bf90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bfa0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
bfb0: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
bfc0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
bfd0: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
bfe0: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
bff0: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
c000: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
c010: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c020: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
c030: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
c040: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
c050: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
c060: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
c070: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
c080: 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  +){.      pInfo-
c090: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
c0a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
c0b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c0c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
c0d0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
c0e0: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
c0f0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
c100: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
c110: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
c120: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
c130: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
c140: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
c150: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
c170: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
c180: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
c190: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
c1a0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
c1b0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
c1c0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
c1d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
c1e0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c1f0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
c200: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
c210: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
c220: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
c230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c240: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
c250: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
c260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
c270: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
c280: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c290: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
c2a0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
c2b0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
c2c0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
c2d0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
c2f0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
c300: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
c310: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
c320: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
c330: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
c340: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
c350: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c360: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
c370: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
c380: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
c390: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
c3a0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
c3b0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
c3c0: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
c3d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
c3e0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
c3f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c400: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
c410: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
c420: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
c430: 7a 55 73 61 67 65 29 7b 0a 20 20 45 78 70 6c 61  zUsage){.  Expla
c440: 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
c450: 72 73 65 2c 20 30 2c 20 22 55 53 45 20 54 45 4d  rse, 0, "USE TEM
c460: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
c470: 2c 20 7a 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f  , zUsage));.}../
c480: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
c490: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
c4a0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
c4b0: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
c4c0: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
c4d0: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
c4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c4f0: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
c500: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c510: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
c520: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
c530: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
c540: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
c550: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
c560: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
c570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c580: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
c590: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
c5a0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
c5b0: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
c5c0: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
c5d0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c5e0: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
c5f0: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
c600: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
c610: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
c620: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
c630: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
c640: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
c650: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
c660: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
c670: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
c680: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
c690: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
c6a0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
c6b0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
c6c0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
c6d0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
c6e0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
c6f0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
c700: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
c710: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
c720: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
c730: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
c740: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
c750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
c760: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
c770: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
c780: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
c790: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
c7a0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
c7b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c7e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
c7f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c800: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
c810: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
c820: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
c830: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c840: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
c850: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
c860: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
c870: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
c880: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
c890: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
c8a0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
c8b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c8c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
c8f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
c900: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
c910: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
c920: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
c930: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
c940: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
c950: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
c960: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c970: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
c980: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
c990: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
c9a0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
c9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c9c0: 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70  p of output loop
c9d0: 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e  . Jump for Next.
c9e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e   */.  int addrOn
c9f0: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ca00: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
ca10: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
ca20: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ca30: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ca40: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
ca50: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ca60: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ca70: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
ca80: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
ca90: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
cac0: 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f  ey columns in so
cad0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
cae0: 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20   int iSortTab;  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f   /* Sorter curso
cb10: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
cb20: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
cb30: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb50: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
cb60: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
cb70: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74  eq. no. */.  int
cb80: 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20   nRefKey = 0;.  
cb90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cba0: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
cbb0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
cbc0: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
cbd0: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
cbe0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
cbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cc00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cc10: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
cc20: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
cc30: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
cc40: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
cc50: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
cc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
cc80: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
cc90: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
cca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
ccb0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 2f  R_REFERENCES.  /
ccc0: 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72 73 6f  * Open any curso
ccd0: 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20 73 6f  rs needed for so
cce0: 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 65  rter-reference e
ccf0: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
cd00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
cd10: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
cd20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
cd30: 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  = pSort->aDefer[
cd40: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  i].pTab;.    int
cd50: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cd60: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
cd70: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
cd80: 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
cd90: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
cda0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66  rse, pSort->aDef
cdb0: 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c  er[i].iCsr, iDb,
cdc0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
cdd0: 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79  ad);.    nRefKey
cde0: 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20   = MAX(nRefKey, 
cdf0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce00: 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  .nKey);.  }.#end
ce10: 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70 53 6f  if..  iTab = pSo
ce20: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
ce30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ce40: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
ce50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
ce60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
ce70: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
ce80: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
ce90: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
cea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
ceb0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
cec0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ced0: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
cee0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
cef0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
cf00: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  umn);.  }.  nKey
cf10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cf20: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cf30: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cf40: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cf50: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cf60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
cf70: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
cf80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
cf90: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
cfa0: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
cfb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cfc0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
cfd0: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
cfe0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
cff0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d000: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d020: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d030: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d040: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d050: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d060: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d070: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d080: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d090: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d0a0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d0c0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d0d0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d0e0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d0f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d100: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d110: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d120: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d140: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d150: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d160: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d170: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d180: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d190: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d1a0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d1b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d1c0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d1d0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d1e0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1f0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d200: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d210: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d220: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d230: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d240: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d250: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d260: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d270: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d280: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d290: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d2a0: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d2b0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d2c0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d2d0: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d2e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d2f0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d300: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d310: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d320: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d330: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d340: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d350: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d360: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d370: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d380: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d390: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d3a0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d3b0: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d3c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d3d0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d3e0: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d3f0: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d400: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d420: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d430: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d440: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d450: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d470: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d480: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d490: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4b0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d4c0: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d4f0: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d510: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d520: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d530: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d540: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d550: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d560: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d570: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d580: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d5b0: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d5c0: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d5e0: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d5f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d600: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d610: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d620: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d630: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d640: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d660: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d670: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d680: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d6b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d6c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d6e0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d6f0: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d700: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d710: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d720: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d740: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d750: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d760: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d770: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d780: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d790: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d7a0: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d7c0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d7d0: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d7e0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d7f0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d800: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d810: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d820: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d840: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d850: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d870: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d880: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d890: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d8a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d8b0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d8c0: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d8d0: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d8e0: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d8f0: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d900: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d910: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d920: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d930: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d950: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
d960: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
d970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d990: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
d9a0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
d9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
d9d0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
d9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
da00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
da10: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
da20: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
da30: 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65   nColumn==sqlite
da40: 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d  3Strlen30(pDest-
da50: 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20  >zAffSdst) );.  
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
da80: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
da90: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69  nColumn, regRowi
daa0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
dab0: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
dac0: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c  ->zAffSdst, nCol
dad0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
dae0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
daf0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
db00: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
db10: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db20: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
db30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db40: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
db50: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
db60: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
db70: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
db80: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
db90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
dba0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
dbb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
dbc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
dbd0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
dbe0: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
dbf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
dc00: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
dc10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
dc20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
dc30: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
dc40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
dc50: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
dc60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc70: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
dc80: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
dc90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcc0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
dcd0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
dce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd00: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
dd10: 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  {.    if( eDest=
dd20: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
dd30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd40: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
dd50: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
dd60: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
dd70: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dd80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dd90: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
dda0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
ddb0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ddc0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
ddd0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
dde0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
ddf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
de00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
de10: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
de20: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
de30: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
de40: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
de50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de60: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
de70: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
de80: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
de90: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
dea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
deb0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dec0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
ded0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dee0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
def0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
df00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
df10: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
df20: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
df30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
df40: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
df50: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
df60: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
df70: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
df80: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
df90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
dfa0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
dfb0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
dfc0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
dfd0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
dfe0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
dff0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
e000: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
e010: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
e020: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
e030: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
e040: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
e050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
e060: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
e070: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
e080: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
e090: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
e0a0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
e0b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e0c0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
e0d0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e0e0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
e0f0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
e100: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
e110: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
e120: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
e130: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
e140: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
e150: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
e160: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
e170: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
e180: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
e190: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
e1a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e1b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e1c0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
e1d0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
e1e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e1f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
e200: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e210: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e220: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
e230: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
e240: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
e250: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
e260: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
e270: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
e280: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
e290: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e2a0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
e2b0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
e2c0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
e2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e2e0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
e2f0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
e300: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
e310: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
e320: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
e330: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e340: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
e350: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
e360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e370: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e380: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
e390: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e3a0: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e3b0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23  mpl(A,B,C,D,E).#
e3c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
e3d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
e3e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e3f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
e400: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e410: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e420: 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a  mpl(A,B).#endif.
e430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e440: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
e450: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
e460: 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20   *pNC, .#ifndef 
e470: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e480: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e490: 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73  Expr *pExpr.#els
e4a0: 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  e.  Expr *pExpr,
e4b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e4c0: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
e4d0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
e4e0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
e4f0: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e   **pzOrigCol.#en
e500: 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dif.){.  char co
e510: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
e520: 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20    int j;.#ifdef 
e530: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e540: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e550: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
e560: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
e570: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
e580: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e590: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
e5a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
e5b0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e5c0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
e5d0: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61  rcList!=0 );.  a
e5e0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e5f0: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
e600: 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  );  /* This rout
e610: 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65  ine runes before
e620: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20   aggregates.    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
e660: 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  sed */.  switch(
e670: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e680: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
e690: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e6b0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
e6c0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
e6d0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
e6e0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
e6f0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
e700: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
e710: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
e720: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
e730: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
e740: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
e750: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
e760: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
e770: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e780: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
e790: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e7a0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
e7b0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e7d0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
e7e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e7f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
e800: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
e810: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
e820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
e830: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
e840: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
e850: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
e860: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
e870: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
e880: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
e890: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
e8a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
e8b0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
e8c0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
e8d0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
e8e0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
e8f0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
e900: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
e910: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
e920: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e930: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
e940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e950: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
e960: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e970: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e980: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
e990: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
e9a0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
e9b0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
e9c0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
e9d0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
e9e0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
e9f0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
ea00: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
ea10: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
ea20: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
ea30: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
ea40: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
ea50: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ea60: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
ea70: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
ea80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
ea90: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
eaa0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
eab0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
eac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
ead0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eae0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
eaf0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
eb00: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
eb10: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
eb20: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
eb30: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
eb50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eb60: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eb70: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
eb80: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
eb90: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
eba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ebb0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
ebc0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
ebd0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
ebe0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
ebf0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
ec00: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
ec10: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
ec20: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
ec30: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
ec40: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
ec50: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
ec60: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
ec70: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
ec80: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
ec90: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
eca0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
ecb0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
ecc0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
ecd0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
ece0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
ecf0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
ed00: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ed10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed20: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ed30: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3d 3d   pExpr->y.pTab==
ed40: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
ed50: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
ed60: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
ed70: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
ed80: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
ed90: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
eda0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
edb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
edc0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
edd0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
ede0: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
edf0: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
ee00: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
ee10: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
ee20: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
ee30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ee40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
ee50: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
ee60: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
ee70: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
ee80: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
ee90: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
eea0: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
eeb0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
eec0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
eed0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
eee0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
eef0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
ef00: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
ef10: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
ef20: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
ef30: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
ef40: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ef50: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
ef60: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
ef70: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
ef80: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
ef90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
efa0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
efb0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
efc0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
efd0: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
efe0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
eff0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
f000: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
f010: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
f020: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
f030: 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20  ,&zOrigCol); .  
f040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f050: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f060: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  A real table or 
f070: 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20  a CTE table */. 
f080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f090: 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pS );.#ifdef SQL
f0a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f0b0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
f0c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
f0d0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
f0e0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
f0f0: 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  rt( iCol==XN_ROW
f100: 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  ID || (iCol>=0 &
f110: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
f120: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
f130: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
f140: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
f150: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
f160: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72     zOrigCol = "r
f170: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
f180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f190: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
f1a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f1b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
f1c0: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
f1d0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
f1e0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
f1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
f200: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
f220: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26  f( pNC->pParse &
f230: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  & pTab->pSchema 
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f250: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f260: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
f270: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
f280: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
f290: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
f2a0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
f2b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
f2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
f2d0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73 73  else.        ass
f2e0: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
f2f0: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
f300: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
f310: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
f320: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
f330: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
f340: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
f350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f360: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f370: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f380: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f390: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
f3a0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
f3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
f3e0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
f3f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
f400: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
f410: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
f420: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
f430: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
f440: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
f450: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
f460: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
f470: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
f480: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
f490: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
f4a0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
f4b0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
f4c0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
f4d0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
f4e0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
f4f0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
f500: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
f510: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
f520: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
f530: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
f540: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
f550: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
f560: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f570: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
f580: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
f590: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
f5a0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f5b0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
f5c0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
f5d0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
f5e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f5f0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
f600: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f610: 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69  N_METADATA  .  i
f620: 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20  f( pzOrigDb ){. 
f630: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
f640: 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f  gTab && pzOrigCo
f650: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
f660: 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20  Db = zOrigDb;.  
f670: 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a    *pzOrigTab = z
f680: 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a  OrigTab;.    *pz
f690: 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43  OrigCol = zOrigC
f6a0: 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ol;.  }.#endif. 
f6b0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
f6c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f6d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f6e0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
f6f0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
f700: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
f710: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
f720: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
f730: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
f740: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
f750: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
f760: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
f770: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
f780: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
f790: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
f7a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
f7b0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
f7c0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
f7d0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
f7e0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
f7f0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
f800: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f810: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f820: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
f830: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
f840: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
f850: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
f860: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e  pParse;.  sNC.pN
f870: 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ext = 0;.  for(i
f880: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
f890: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
f8a0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
f8b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
f8d0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
f8e0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f8f0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
f900: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
f910: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
f920: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
f930: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f940: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
f950: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
f960: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f970: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f980: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f990: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
f9a0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
f9b0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
f9c0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
f9d0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
f9e0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
f9f0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
fa00: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
fa10: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
fa20: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
fa30: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
fa40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
fa50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
fa60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fa70: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
fa80: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
fa90: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
faa0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fab0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fac0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
fad0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fae0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
faf0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
fb00: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
fb10: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
fb20: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fb30: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
fb40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fb50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
fb60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
fb70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb90: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
fba0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fbb0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
fbc0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
fbd0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
fbe0: 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ) */.}.../*.** C
fbf0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
fc00: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45  n names for a SE
fc10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
fc20: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
fc30: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
fc40: 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
fc50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
fc60: 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
fc70: 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
fc80: 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
fc90: 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
fca0: 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
fcb0: 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
fcc0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
fcd0: 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
fce0: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
fcf0: 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
fd00: 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
fd10: 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
fd20: 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
fd30: 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
fd40: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd50: 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
fd60: 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
fd70: 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
fd80: 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
fd90: 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
fda0: 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
fdb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
fdc0: 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
fdd0: 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
fde0: 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f   Also: sqlite3Co
fdf0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
fe00: 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52  t().**.** The PR
fe10: 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d  AGMA short_colum
fe20: 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47  n_names and PRAG
fe30: 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  MA full_column_n
fe40: 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61 72  ames settings ar
fe50: 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e  e.** deprecated.
fe60: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 65    The default se
fe70: 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f  tting is short=O
fe80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39  N, full=OFF.  99
fe90: 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70  .9% of all.** ap
fea0: 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c  plications shoul
feb0: 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20 77  d operate this w
fec0: 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ay.  Nevertheles
fed0: 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75  s, we need to su
fee0: 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68  pport the.** oth
fef0: 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67  er modes for leg
ff00: 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68  acy:.**.**    sh
ff10: 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46  ort=OFF, full=OF
ff20: 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  F:      Column n
ff30: 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74 20  ame is the text 
ff40: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ff50: 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20  n has it.**     
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61           origina
ff80: 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20 74  lly appears in t
ff90: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ffa0: 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20  ent.  In.**     
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 77           other w
ffd0: 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20  ords, the zSpan 
ffe0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65 78  of the result ex
fff0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
10000 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c     short=ON, ful
10010 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68  l=OFF:       (Th
10020 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
10030 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20  t setting).  If 
10040 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72             refer
10070 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20  s directly to a 
10080 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  table column, th
10090 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  en the.**       
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f         result co
100c0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73  lumn name is jus
100d0 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  t the table colu
100e0 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  mn.**           
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e     name: COLUMN.
10110 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20    Otherwise use 
10120 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  zSpan..**.**    
10130 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41  full=ON, short=A
10140 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68 65  NY:       If the
10150 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20 64   result refers d
10160 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10170 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20  le column,.**   
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20             then 
101a0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
101b0 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  n name with the 
101c0 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
101f0 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c  x, ex: TABLE.COL
10200 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10210 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74  use zSpan..*/.st
10220 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
10230 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
10240 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10250 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
10260 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10270 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
10280 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75  /* Generate colu
10290 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  mn names for thi
102a0 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
102b0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
102c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
102d0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54  be;.  int i;.  T
102e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72  able *pTab;.  Sr
102f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
10300 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
10310 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
10320 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10330 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b  .  int fullName;
10340 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c      /* TABLE.COL
10350 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
10360 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69 72  use and is a dir
10370 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f  ect table ref */
10380 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20  .  int srcName; 
10390 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72      /* COLUMN or
103a0 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66   TABLE.COLUMN if
103b0 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e   no AS clause an
103c0 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a  d is direct */..
103d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103e0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
103f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
10400 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
10410 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
10420 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
10450 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
10460 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  sSet ) return;. 
10470 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
10480 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20   are determined 
10490 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  by the left-most
104a0 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
104b0 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20  und select */.  
104c0 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
104d0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
104e0 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
104f0 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43  or;.  SELECTTRAC
10500 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65  E(1,pParse,pSele
10510 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20  ct,("generating 
10520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29  column names\n")
10530 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  );.  pTabList = 
10540 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
10550 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
10560 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
10570 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
10580 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21  ssert( pTabList!
10590 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
105a0 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
105b0 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64  .  fullName = (d
105c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
105d0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
105e0 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20  =0;.  srcName = 
105f0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
10600 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
10610 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d  s)!=0 || fullNam
10620 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
10630 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
10640 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
10650 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
10660 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10670 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
10680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10690 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
106a0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
106b0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  t( p->op!=TK_AGG
106c0 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41  _COLUMN );  /* A
106d0 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61  gg processing ha
106e0 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f  s not run yet */
106f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10700 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
10710 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30 20 29 3b   p->y.pTab!=0 );
10720 20 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78   /* Covering idx
10730 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a   not yet coded *
10740 2f 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  /.    if( pEList
10750 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
10760 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63        /* An AS c
10770 6c 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b  lause always tak
10780 65 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74  es first priorit
10790 79 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  y */.      char 
107a0 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
107b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
107d0 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
107e0 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
107f0 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
10800 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
10810 20 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20   if( srcName && 
10820 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
10830 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
10840 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
10850 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
10860 6e 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  n;.      pTab = 
10870 70 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  p->y.pTab;.     
10880 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
10890 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
108a0 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
108b0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
108c0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
108d0 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
108e0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
108f0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
10900 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
10910 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
10920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10930 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
10940 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
10950 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
10960 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20     if( fullName 
10970 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
10980 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
10990 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
109a0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
109b0 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
109c0 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
109d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
109e0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
109f0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
10a00 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
10a10 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
10a20 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10a30 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10a40 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10a50 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
10a60 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
10a70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10a80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10a90 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
10aa0 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
10ab0 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
10ac0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10ad0 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
10ae0 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
10af0 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
10b00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10b10 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10b20 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
10b30 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
10b40 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
10b50 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
10b60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
10b70 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
10b80 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
10b90 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
10ba0 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
10bb0 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
10bc0 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
10bd0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10be0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
10bf0 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
10c00 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
10c10 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
10c20 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
10c30 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
10c40 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
10c50 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
10c60 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
10c70 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
10c80 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10c90 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
10ca0 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
10cb0 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
10cc0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
10cd0 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
10ce0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
10cf0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10d00 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
10d10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
10d20 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
10d30 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
10d40 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
10d50 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
10d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a  SQLITE_NOMEM..**
10d70 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
10d80 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
10d90 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
10da0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
10db0 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
10dc0 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
10dd0 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
10de0 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
10df0 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
10e00 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
10e10 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
10e20 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
10e30 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
10e40 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
10e50 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
10e60 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
10e70 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
10e80 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
10e90 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
10ea0 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
10eb0 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
10ec0 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
10ed0 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
10ee0 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
10ef0 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
10f00 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
10f10 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
10f20 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
10f30 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c  lso: generateCol
10f40 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e  umnNames().*/.in
10f50 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
10f60 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
10f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10f80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10f90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10fa0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10fb0 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
10fc0 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
10fd0 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
10fe0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
10ff0 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
11000 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11010 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
11020 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
11030 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
11040 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11050 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
11060 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
11070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11080 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
11090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
110a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
110d0 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
110e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
11100 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
11110 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
11120 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
11130 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
11140 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11150 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
11160 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11190 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
111a0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61  ult set */.  cha
111b0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
111d0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
111e0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11200 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
11210 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
11220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11230 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
11240 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
11250 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
11260 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
11270 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
11280 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
11290 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
112a0 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
112b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
112c0 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
112d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
112e0 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20   aCol==0 );.    
112f0 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29  if( nCol>32767 )
11300 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20   nCol = 32767;. 
11310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
11320 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
11330 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
11340 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f  ( nCol==(i16)nCo
11350 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  l );.  *pnCol = 
11360 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
11370 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
11380 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
11390 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nCol && !db->mal
113a0 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20  locFailed; i++, 
113b0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
113c0 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
113d0 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
113e0 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
113f0 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
11400 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
11410 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
11420 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
11430 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
11440 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
11450 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
11460 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65  e name */.    }e
11470 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
11480 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69  *pColExpr = sqli
11490 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
114a0 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
114b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 77 68  pExpr);.      wh
114c0 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
114d0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
114e0 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
114f0 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
11500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11510 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
11520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11530 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d  ssert( pColExpr-
11540 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
11550 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
11560 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11570 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
11580 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
11590 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
115a0 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
115b0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
115c0 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
115d0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
115e0 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
115f0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
11600 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11610 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11620 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11630 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11640 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11650 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11660 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11670 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11690 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
116a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
116c0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
116d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116e0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
116f0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11710 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11720 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11730 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11740 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11750 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11760 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11770 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11780 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11790 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
117a0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
117c0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
117d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
117e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
117f0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11810 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11820 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11830 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11840 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11850 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11860 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11870 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11880 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11890 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
118a0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118b0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
118c0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
118d0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
118e0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
118f0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11900 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11920 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11930 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11940 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11950 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11960 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11970 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11980 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11990 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
119a0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119b0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
119c0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
119d0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
119e0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
119f0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
11a00 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a10 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a30 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a40 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a50 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11a60 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11a70 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11a80 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11a90 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11aa0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11ab0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11ac0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ae0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11af0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11b00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b10 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b30 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b40 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b50 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11b60 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11b90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11ba0 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11bb0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11bc0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11bd0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11be0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11bf0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11c00 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c10 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c20 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c30 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c40 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c50 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11c60 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11c70 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11c80 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11c90 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11ca0 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11cb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cd0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11ce0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11cf0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11d00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d10 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d20 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d30 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d40 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11d60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11d70 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11d80 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11d90 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11da0 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11db0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11dc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11dd0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11de0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11df0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11e00 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
11e10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
11e30 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
11e40 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
11e50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11e60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
11e70 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
11e80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
11e90 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
11ea0 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
11eb0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
11ec0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
11ed0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
11ee0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
11ef0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
11f00 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
11f10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11f20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11f30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11f40 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
11f50 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
11f60 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
11f70 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
11f80 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
11f90 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
11fa0 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
11fb0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
11fc0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
11fd0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11fe0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
11ff0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
12000 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12010 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12020 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12030 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12040 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12050 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12060 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12070 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12080 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12090 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
120a0 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
120b0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
120c0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
120d0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
120e0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
120f0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
12100 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12110 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12120 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12130 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12140 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12150 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12160 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12170 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12180 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12190 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
121a0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
121b0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
121c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
121e0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
121f0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
12200 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12210 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12220 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12230 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12240 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12250 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12260 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12270 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12280 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
122a0 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
122b0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
122c0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
122d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
122e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122f0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
12300 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12310 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12320 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12330 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12340 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12350 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12360 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12370 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12380 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12390 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
123a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
123b0 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
123c0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
123d0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
123e0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
123f0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
12400 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12410 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
12420 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
12430 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
12440 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
12450 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12460 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
12470 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
12480 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
12490 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
124a0 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
124b0 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
124c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
124d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
124e0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
124f0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
12500 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12510 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
12520 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12530 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
12540 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
12550 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
12560 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
12570 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
12580 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
12590 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
125a0 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
125b0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
125c0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
125d0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
125e0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
125f0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
12600 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
12610 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12620 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
12630 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
12640 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
12650 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12660 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12670 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12680 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
12690 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
126a0 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
126b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
126c0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
126d0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
126e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
126f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
12700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
12710 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
12720 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
12730 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
12740 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
12750 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
12760 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
12770 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
12780 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
12790 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
127a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
127b0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
127c0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
127d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
127e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
127f0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
12800 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
12810 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
12820 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
12830 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
12840 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
12850 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
12860 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
12870 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
12880 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
12890 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
128a0 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
128b0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
128c0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
128d0 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
128e0 0a 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65  .** pLimit expre
128f0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d  ssions.  pLimit-
12900 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69  >pLeft and pLimi
12910 74 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74  t->pRight hold t
12920 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
12930 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
12940 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
12950 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
12960 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
12970 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
12980 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
12990 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
129a0 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
129b0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
129c0 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
129d0 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
129e0 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
129f0 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
12a00 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
12a10 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
12a20 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
12a30 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
12a40 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
12a50 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12a60 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
12a70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12a80 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
12a90 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
12aa0 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
12ab0 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
12ac0 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
12ad0 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e  ined by pLimit->
12ae0 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12af0 2d 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69  ->pRight.  iLimi
12b00 74 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74  t.** and iOffset
12b10 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12b20 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
12b30 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
12b40 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
12b50 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12b60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
12b70 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
12b80 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
12b90 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
12ba0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
12bb0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
12bc0 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
12bd0 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
12be0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12bf0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
12c00 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
12c10 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12c20 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
12c30 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
12c40 74 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74  t->pLeft!=0 do t
12c50 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12c60 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
12c70 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
12c80 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
12c90 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
12ca0 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
12cb0 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
12cc0 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
12cd0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
12ce0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
12cf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12d00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12d10 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
12d20 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
12d30 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12d40 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
12d50 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
12d60 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
12d70 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
12d80 20 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a   int n;.  Expr *
12d90 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12da0 69 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c  it;..  if( p->iL
12db0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
12dc0 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
12dd0 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
12de0 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
12df0 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
12e00 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
12e10 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
12e20 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
12e30 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
12e40 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
12e50 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
12e60 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
12e70 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
12e80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12e90 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  imit ){.    asse
12ea0 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d  rt( pLimit->op==
12eb0 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TK_LIMIT );.    
12ec0 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12ed0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
12ee0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
12ef0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
12f00 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
12f10 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12f20 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
12f30 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
12f40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12f50 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c  teger(pLimit->pL
12f60 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  eft, &n) ){.    
12f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12f90 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
12fa0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12fb0 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
12fc0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
12fd0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
12fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12ff0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
13000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
13010 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
13020 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
13030 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
13040 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13050 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
13060 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
13070 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
13080 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
13090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
130a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
130b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
130c0 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  e, pLimit->pLeft
130d0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
130e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130f0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
13100 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
13110 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13120 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
13130 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
13140 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13160 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
13170 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
13180 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13190 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d    }.    if( pLim
131a0 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  it->pRight ){.  
131b0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
131c0 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
131d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
131e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
131f0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
13200 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
13210 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
13220 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
13230 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13240 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  e, pLimit->pRigh
13250 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
13260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13270 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
13280 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
13290 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
132a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
132b0 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
132c0 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
132d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
132e0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
132f0 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
13300 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
13310 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13320 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
13330 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
13340 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
13350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13360 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
13370 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
13380 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
13390 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
133a0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
133b0 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
133c0 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
133d0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
133e0 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
133f0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
13400 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
13410 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
13420 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13430 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
13440 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
13450 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
13460 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
13470 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
13480 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
13490 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
134a0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
134b0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
134c0 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
134d0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
134e0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
134f0 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
13500 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
13510 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
13520 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
13530 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13540 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
13550 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
13560 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
13570 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
13580 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
13590 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
135a0 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
135b0 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
135c0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
135d0 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
135e0 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
135f0 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
13600 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
13610 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
13620 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
13630 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
13640 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
13650 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
13660 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
13670 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13680 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
13690 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
136a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
136b0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
136c0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
136d0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
136e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
136f0 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
13700 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13710 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13720 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
13730 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13740 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
13750 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
13760 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
13770 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
13780 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
13790 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
137a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
137b0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
137c0 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
137d0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
137e0 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
137f0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
13800 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
13810 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
13820 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
13830 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
13840 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
13850 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
13860 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13870 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
13880 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13890 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
138a0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
138b0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
138c0 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
138d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
138e0 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
138f0 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
13900 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
13910 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
13920 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
13930 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13940 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
13950 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
13960 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13970 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
13980 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
13990 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
139a0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
139b0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
139c0 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
139d0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
139e0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
139f0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13a00 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a10 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
13a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a30 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13a40 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13a50 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
13a60 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
13a70 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
13a80 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
13a90 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13aa0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
13ab0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13ac0 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
13ad0 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
13ae0 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
13af0 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
13b00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
13b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13b20 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
13b30 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
13b40 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
13b50 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
13b60 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
13b70 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
13b80 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13b90 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13ba0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13bb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13bc0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13be0 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13bf0 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13c00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13c10 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13c20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
13c30 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
13c40 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
13c50 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
13c60 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
13c70 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13ca0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13cb0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13cc0 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13d10 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13d20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13d30 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13d40 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
13d50 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
13d60 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
13d70 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
13d80 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13d90 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13da0 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13db0 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13dc0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13dd0 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13de0 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13df0 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13e00 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13e10 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13e20 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
13e30 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
13e40 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
13e50 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
13e60 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
13e70 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
13e80 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13e90 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13ea0 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13eb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13ec0 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13ed0 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13ee0 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13ef0 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13f00 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13f10 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13f20 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
13f30 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13f40 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
13f50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13f60 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
13f70 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
13f80 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13f90 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13fa0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
13fb0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
13fc0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
13fd0 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
13fe0 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
13ff0 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted 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 20 69 44 69 73 74 69  ble.  The iDisti
14020 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
14030 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
14040 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
14050 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
14060 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
14070 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
14080 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
14090 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
140a0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
140b0 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
140c0 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
140d0 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
140e0 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
140f0 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
14100 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
14110 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
14120 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
14130 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
14140 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
14150 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
14160 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
14170 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
14180 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14190 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
141a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
141b0 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
141c0 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
141d0 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
141e0 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
141f0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
14200 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
14210 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
14220 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
14230 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
14240 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
14250 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
14260 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
14270 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
14280 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
14290 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
142a0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
142b0 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
142c0 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
142d0 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
142e0 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
142f0 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
14300 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
14310 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
14320 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
14330 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
14340 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
14350 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
14360 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
14370 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14380 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14390 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
143a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
143b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
143c0 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
143d0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
143e0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
143f0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
14400 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
14410 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
14420 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
14430 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14440 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14450 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
14460 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
14470 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
14480 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
14490 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
144a0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
144b0 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
144c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
144d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
144e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
144f0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14500 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
14510 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
14520 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
14530 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
14540 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14560 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
14570 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
14580 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
14590 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
145a0 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
145b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
145c0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
145d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
145e0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
145f0 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14610 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14620 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
14630 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
14660 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14670 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
14680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
14690 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
146a0 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
146b0 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
146c0 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
146d0 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
146e0 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
146f0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
14700 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
14710 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
14720 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
14730 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14750 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14760 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
14770 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14790 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
147a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
147b0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
147c0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
147d0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
147e0 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
147f0 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
14800 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14810 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
14820 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
14830 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14840 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
14850 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23  and OFFSET */..#
14860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14870 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
14880 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20  if( p->pWin ){. 
14890 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
148a0 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
148b0 6f 74 20 75 73 65 20 77 69 6e 64 6f 77 20 66 75  ot use window fu
148c0 6e 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 75 72  nctions in recur
148d0 73 69 76 65 20 71 75 65 72 69 65 73 22 29 3b 0a  sive queries");.
148e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
148f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74  #endif..  /* Obt
14900 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
14910 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
14920 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14930 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14940 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14950 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
14960 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14970 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
14980 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14990 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
149a0 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
149b0 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
149c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
149d0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
149e0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
149f0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
14a00 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
14a10 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14a20 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
14a30 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
14a40 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
14a50 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14a60 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
14a70 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
14a80 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
14a90 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
14aa0 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
14ab0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14ac0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
14ad0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14ae0 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
14af0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
14b00 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
14b10 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
14b20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
14b30 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
14b40 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
14b50 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
14b60 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
14b70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14b80 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14b90 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
14ba0 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
14bb0 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
14bc0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
14bd0 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
14be0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
14bf0 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
14c00 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
14c10 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
14c20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
14c30 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
14c40 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
14c50 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
14c60 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
14c70 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
14c80 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14c90 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14ca0 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
14cb0 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
14cc0 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
14cd0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
14ce0 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
14cf0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14d00 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
14d10 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
14d20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14d30 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
14d40 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
14d50 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14d60 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
14d70 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
14d80 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
14d90 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
14da0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14dc0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
14dd0 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
14de0 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
14df0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14e00 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
14e10 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
14e20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
14e30 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
14e40 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14e50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14e60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14e70 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
14e80 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
14eb0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
14ec0 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
14ed0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
14ee0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
14ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f00 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f10 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
14f20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
14f30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
14f40 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
14f50 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
14f60 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
14f70 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
14f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f90 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14fa0 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
14fb0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
14fc0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14fd0 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
14fe0 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
14ff0 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
15000 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
15010 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
15020 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
15030 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15040 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
15050 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
15060 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15070 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51   = 0;.  ExplainQ
15080 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15090 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a  , 1, "SETUP"));.
150a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
150b0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
150c0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
150d0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
150e0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
150f0 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
15100 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
15110 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
15120 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
15130 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
15140 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
15150 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
15160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15170 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
15180 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
15190 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
151a0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
151b0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
151c0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
151d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
151e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
151f0 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
15200 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
15210 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
15220 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
15230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15240 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15250 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
15260 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
15270 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
15280 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
152a0 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
152b0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
152c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
152d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
152e0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
152f0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
15300 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
15310 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
15320 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15330 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15340 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
15350 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
15360 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
15370 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15380 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20   iCurrent,.     
15390 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64   0, 0, pDest, ad
153a0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
153b0 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d  k);.  if( regLim
153c0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
153d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
153e0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
153f0 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
15400 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
15410 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
15420 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15430 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
15440 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
15450 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
15460 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
15470 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
15480 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
15490 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
154a0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
154b0 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
154c0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
154d0 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ueue..  */.  if(
154e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
154f0 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
15500 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15510 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75  sg(pParse, "recu
15520 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20  rsive aggregate 
15530 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70  queries not supp
15540 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  orted");.  }else
15550 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  {.    p->pPrior 
15560 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e  = 0;.    Explain
15570 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15580 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45  e, 1, "RECURSIVE
15590 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71   STEP"));.    sq
155a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
155b0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
155c0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
155d0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
155e0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
155f0 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
15600 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
15610 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
15620 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
15630 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15640 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
15650 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15660 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15670 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
15680 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
15690 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
156a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
156b0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
156c0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
156d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
156e0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
156f0 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
15700 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15710 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
15720 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
15730 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
15740 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
15750 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
15760 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15770 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15780 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15790 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
157a0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
157b0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
157c0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
157d0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
157e0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
157f0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15800 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
15810 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
15820 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
15830 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
15840 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
15850 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
15860 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
15870 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
15880 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
15890 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
158a0 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
158b0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
158c0 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
158d0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
158e0 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
158f0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
15900 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
15910 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
15920 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
15930 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
15940 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
15950 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
15960 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
15970 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
15980 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
15990 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
159a0 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
159b0 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
159c0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
159d0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
159e0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
159f0 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
15a00 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
15a10 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
15a20 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
15a30 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
15a40 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
15a50 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
15a60 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
15a70 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
15a80 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
15a90 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
15aa0 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
15ab0 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
15ac0 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
15ad0 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
15ae0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
15af0 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
15b00 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
15b10 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15b20 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
15b30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15b40 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15b50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15b60 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15b70 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15b80 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
15b90 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15ba0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15bb0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
15bc0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
15bd0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
15be0 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
15bf0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nt rc = 0;.  int
15c00 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70   bShowAll = p->p
15c10 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65  Limit==0;.  asse
15c20 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15c30 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
15c40 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
15c50 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15c60 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
15c70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
15c80 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
15c90 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
15ca0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
15cb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15cc0 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
15cd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
15ce0 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
15cf0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
15d00 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
15d10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
15d20 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
15d30 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
15d40 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
15d50 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77     nRow += bShow
15d60 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  All;.  }while(1)
15d70 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
15d80 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
15d90 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41   "SCAN %d CONSTA
15da0 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c  NT ROW%s", nRow,
15db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15dc0 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22       nRow==1 ? "
15dd0 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69  " : "S"));.  whi
15de0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c  le( p ){.    sel
15df0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15e00 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
15e10 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a  , pDest, 1, 1);.
15e20 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c      if( !bShowAl
15e30 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  l ) break;.    p
15e40 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
15e50 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
15e60 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
15e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15e80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15e90 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
15ea0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
15eb0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
15ec0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
15ed0 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
15ee0 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
15ef0 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
15f00 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
15f10 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
15f20 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
15f30 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
15f40 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
15f50 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
15f60 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
15f70 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
15f80 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
15f90 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
15fa0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
15fb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
15fc0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
15fd0 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
15fe0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
15ff0 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
16000 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16010 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
16020 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
16030 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
16040 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
16050 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
16060 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
16070 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
16080 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
16090 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
160a0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
160b0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
160c0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
160d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
160e0 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
160f0 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
16100 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
16110 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
16120 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
16130 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
16140 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
16150 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
16160 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
16170 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
16180 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
16190 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
161a0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
161b0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
161c0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
161d0 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
161e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
161f0 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
16200 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
16210 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
16220 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
16230 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
16240 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
16250 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
16260 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
16270 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
16280 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
16290 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
162a0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
162b0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
162c0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
162d0 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
162e0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
162f0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
16300 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
16310 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16320 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16340 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
16350 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
16360 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
16370 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
16380 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
16390 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
163a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
163b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
163c0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
163d0 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
163e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
163f0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
16400 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
16410 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
16420 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
16430 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16440 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16450 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
16460 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
16470 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
16480 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
16490 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
164a0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
164b0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
164c0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
164d0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
164e0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
164f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16500 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
16510 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16520 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
16530 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
16540 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
16550 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
16560 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
16570 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
16580 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
16590 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
165a0 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
165b0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
165c0 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
165d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
165e0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
165f0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
16600 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
16610 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
16620 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
16630 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
16640 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
16650 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
16660 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
16670 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
16680 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
16690 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
166a0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
166b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
166c0 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
166d0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
166e0 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
166f0 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
16700 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
16710 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
16720 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
16730 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
16740 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
16750 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16760 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
16770 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16780 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16790 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
167a0 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
167b0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
167c0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
167d0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
167e0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
167f0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
16800 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
16810 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
16820 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
16830 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16840 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
16850 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16860 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16870 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
16880 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
16890 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
168a0 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
168b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
168c0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
168d0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
168e0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
168f0 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
16900 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
16910 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16920 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
16930 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
16940 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
16950 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16960 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16970 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16980 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
16990 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
169a0 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
169b0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
169c0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
169d0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
169e0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
169f0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
16a00 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
16a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16a20 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
16a30 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
16a40 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
16a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
16a60 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
16a70 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16a80 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
16a90 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
16aa0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
16ab0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
16ac0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
16ad0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
16ae0 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
16af0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
16b00 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
16b10 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
16b20 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16b30 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
16b40 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
16b50 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
16b60 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20  }else{..#ifndef 
16b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16b80 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69  AIN.    if( pPri
16b90 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
16ba0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
16bb0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16bc0 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55   1, "COMPOUND QU
16bd0 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78  ERY"));.      Ex
16be0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16bf0 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
16c00 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29  -MOST SUBQUERY")
16c10 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16c20 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
16c30 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
16c40 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
16c50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
16c60 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63      */.    switc
16c70 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
16c80 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
16c90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
16ca0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
16cb0 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
16cc0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
16cd0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
16ce0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
16cf0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
16d00 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
16d10 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
16d20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
16d30 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
16d40 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16d60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16d70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
16d80 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
16d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16da0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
16db0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16dc0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
16dd0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
16de0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
16df0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
16e00 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
16e10 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
16e20 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
16e30 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
16e40 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
16e50 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
16e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e70 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e  v, OP_IfNot, p->
16e80 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
16e90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
16ea0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16eb0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
16ec0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
16ed0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  "));.          i
16ee0 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
16ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16f10 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
16f50 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
16f60 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
16f70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16f80 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16f90 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16fa0 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a   "UNION ALL"));.
16fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16fc0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16fd0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16fe0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17000 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17010 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17020 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17030 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
17040 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
17050 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17060 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
17070 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
17080 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69  tRow);.        i
17090 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
170a0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  t.         && sq
170b0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
170c0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
170d0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
170e0 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  t).         && n
170f0 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
17100 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
17110 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
17120 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29  imit) .        )
17130 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
17140 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
17150 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
17160 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
17170 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  }.        if( ad
17180 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
17190 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
171a0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
171b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
171c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
171d0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
171e0 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EPT:.      case 
171f0 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
17200 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
17210 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
17220 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
17230 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  p table holding 
17240 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
17250 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
17260 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
17270 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
17280 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
17290 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  f */.        int
172a0 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
172b0 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
172c0 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
172d0 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
172e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
172f0 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76  Limit;    /* Sav
17300 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
17310 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20  nLimit  */.     
17320 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
17330 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17340 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20  uniondest;.  .  
17350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17360 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
17370 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17380 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17390 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
173a0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
173b0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  nion;.        if
173c0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
173d0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
173e0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
173f0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
17400 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
17410 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
17420 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  r.          ** r
17430 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ight..          
17440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
17450 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
17460 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
17470 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
17480 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
17490 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
174a0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
174b0 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rm;.        }els
174c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
174d0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
174e0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
174f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
17500 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
17510 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
17520 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
17530 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17540 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
17550 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17560 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17570 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
17580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   );.          ad
17590 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
175a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
175b0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
175c0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
175d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
175e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
175f0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
17600 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
17610 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
17620 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
17630 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
17640 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
17650 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  meral;.         
17660 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17670 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
17680 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17690 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
176a0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
176b0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  left.        */.
176c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
176d0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
176e0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
176f0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17700 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
17710 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
17720 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17730 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17740 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
17750 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17760 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
17770 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
17780 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
17790 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
177a0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
177b0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
177c0 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
177d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
177e0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
177f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  ){.          op 
17800 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
17810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17830 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
17840 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  ;.          op =
17850 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
17860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
17870 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
17880 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
17890 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
178a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
178b0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73          uniondes
178c0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
178d0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
178e0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
178f0 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
17900 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
17930 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
17940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17950 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17960 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
17970 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17990 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;.        /* Que
179a0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
179b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
179c0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
179d0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
179e0 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
179f0 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
17a00 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
17a10 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
17a20 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
17a30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
17a40 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
17a50 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
17a60 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
17a70 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17a80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17a90 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17aa0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
17ab0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
17ac0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
17ad0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
17ae0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
17af0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
17b00 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
17b10 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
17b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17b30 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
17b40 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17b50 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17b60 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
17b70 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
17b80 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
17b90 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20  fset = 0;.  .   
17ba0 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
17bb0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
17bc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17bd0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
17be0 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rm.        ** it
17bf0 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
17c00 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
17c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17c20 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
17c30 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
17c40 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
17c50 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20  orOp );.        
17c60 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
17c70 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
17c80 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
17c90 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
17ca0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17cb0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17cc0 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20           iBreak 
17cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17ce0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17cf0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
17d00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17d10 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
17d20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17d30 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17d40 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17d70 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17d80 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17d90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17da0 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17db0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17dc0 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17dd0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17de0 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17df0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17e10 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17e20 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e50 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17e80 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
17e90 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17ea0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17eb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17ec0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
17ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ef0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
17f00 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17f10 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17f20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17f30 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17f40 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17f50 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17f60 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
17f70 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
17f80 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
17f90 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
17fa0 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
17fb0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
17fc0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
17fd0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
17fe0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
17ff0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
18000 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
18010 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
18020 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
18030 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
18040 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
18050 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
18060 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
18070 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
18080 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18090 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
180a0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
180b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
180c0 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
180d0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
180e0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
180f0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
18100 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
18110 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
18120 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18140 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18150 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
18160 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18170 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
18180 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18190 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
181a0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
181b0 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
181c0 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
181d0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
181e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
181f0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
18200 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
18210 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
18220 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
18230 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
18240 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
18250 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18260 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18270 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
18280 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18290 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
182a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
182b0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
182c0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
182d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
182e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
182f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
18310 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18320 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
18330 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
18340 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
18350 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18360 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18380 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18390 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
183a0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
183b0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
183c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
183d0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
183e0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
183f0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18400 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
18410 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
18420 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
18430 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
18440 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
18450 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
18460 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18470 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
18480 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18490 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
184b0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
184c0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
184d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
184e0 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
184f0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
18500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
18510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18520 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
18530 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
18540 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
18550 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
18560 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18570 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
18580 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18590 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
185a0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
185b0 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
185c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
185d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
185e0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
185f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
18600 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
18610 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18620 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
18630 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
18640 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
18650 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18660 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18680 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18690 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
186a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
186b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
186c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
186d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
186e0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
186f0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18700 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
18710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18730 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
18740 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
18750 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18760 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
18770 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18780 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
18790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
187a0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
187b0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
187c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
187d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
187e0 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
187f0 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20  iCont, r1, 0);. 
18800 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18810 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18820 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18830 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18840 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
18850 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18860 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20  e, p, tab1,.    
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
18890 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
188a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
188c0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
188d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
188e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
188f0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
18900 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18920 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18930 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
18940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18960 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18980 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18990 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
189a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
189c0 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
189d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
189e0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
189f0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61  0 ){.      Expla
18a00 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
18a10 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
18a20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
18a30 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
18a40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
18a50 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
18a60 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
18a70 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
18a80 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
18a90 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
18aa0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
18ab0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
18ac0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18ad0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18ae0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
18af0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
18b00 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18b10 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
18b20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18b30 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
18b40 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
18b50 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
18b60 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
18b70 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
18b80 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
18b90 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
18ba0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
18bb0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
18bc0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
18bd0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18be0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
18bf0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
18c00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18c20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18c30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18c40 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
18c50 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
18c60 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
18c70 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
18c80 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ca0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18cb0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
18cc0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
18cd0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18cf0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18d00 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
18d10 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
18d20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18d40 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
18d50 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
18d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18d70 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
18d80 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
18d90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
18da0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
18db0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
18dc0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
18dd0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
18de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18df0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18e00 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
18e10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18e20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
18e30 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
18e40 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
18e50 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
18e60 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
18e70 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18e80 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
18e90 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
18ea0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
18eb0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
18ec0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
18ed0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
18ee0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
18ef0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
18f00 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
18f10 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
18f20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
18f30 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
18f40 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
18f50 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
18f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
18f70 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
18f80 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
18f90 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
18fa0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
18fb0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
18fc0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
18fd0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
18fe0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
18ff0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19000 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
19010 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
19020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19040 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19050 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
19060 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
19070 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
19080 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
19090 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
190a0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
190d0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
190e0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
190f0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
19100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19110 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19120 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
19130 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
19140 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
19150 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
19160 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
19170 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
19180 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19190 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
191a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
191b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
191c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
191d0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
191e0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
191f0 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
19200 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
19210 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
19220 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
19230 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
19240 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
19250 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
19260 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
19270 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
19280 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
19290 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
192a0 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
192b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
192c0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
192d0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
192e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
192f0 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
19300 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19310 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
19320 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
19330 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
19340 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
19350 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
19360 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
19370 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
19380 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
19390 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
193a0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
193b0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
193c0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
193d0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
193e0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
193f0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
19400 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
19410 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
19420 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
19430 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
19440 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
19450 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
19460 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
19470 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
19480 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
19490 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
194a0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
194b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
194c0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
194d0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
194e0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
194f0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
19500 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
19510 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
19520 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
19530 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
19540 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
19550 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
19560 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
19570 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
19580 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
19590 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
195a0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
195b0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
195c0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
195d0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
195e0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
195f0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
19600 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
19610 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
19620 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
19630 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
19640 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
19650 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
19660 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
19670 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19680 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19690 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
196a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
196b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
196c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
196d0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
196e0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
196f0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
19700 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
19710 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19720 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
19730 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
19740 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
19750 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
19760 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
19770 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
19780 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
19790 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
197a0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
197b0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
197c0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
197d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
197e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
197f0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
19800 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
19810 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
19820 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19830 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
19840 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
19850 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19860 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19870 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
19880 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
19890 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
198a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
198b0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
198c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
198d0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
198e0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
198f0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19900 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
19910 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
19920 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
19930 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
19940 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19950 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
19960 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
19970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19980 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
19990 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
199a0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
199b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
199c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
199d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
199f0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
19a00 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
19a10 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
19a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19a30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
19a40 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
19a50 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
19a60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19a90 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
19aa0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19ab0 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
19ac0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
19ad0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
19ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19af0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19b00 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
19b10 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
19b20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
19b40 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
19b50 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
19b60 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
19b70 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
19b80 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
19b90 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
19ba0 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
19bb0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
19bc0 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
19bd0 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
19be0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19bf0 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
19c00 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
19c10 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
19c20 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
19c30 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
19c40 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
19c50 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
19c60 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
19c70 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
19c80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19c90 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
19ca0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19cb0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cd0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
19ce0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19cf0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
19d00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
19d10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d20 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
19d30 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
19d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19d60 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
19d70 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
19d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
19da0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
19db0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19dc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19dd0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19de0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19df0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19e20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19e30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
19e40 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
19e50 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
19e60 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
19e70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19e80 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
19e90 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
19ea0 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
19eb0 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
19ec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19ed0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ef0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
19f00 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
19f10 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
19f20 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
19f30 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
19f40 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
19f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f60 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
19f70 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
19f80 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20  iSDParm, r1,.   
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64          pIn->iSd
19fb0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19fd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19fe0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
19ff0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a000 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a010 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
1a020 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a030 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
1a040 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
1a050 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1a060 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1a070 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1a080 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
1a090 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
1a0a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
1a0b0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
1a0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
1a0d0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
1a0e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
1a0f0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
1a100 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
1a110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a120 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a130 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a140 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
1a150 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
1a160 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
1a170 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1a180 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
1a190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a1a0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1a1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a1c0 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
1a1d0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1a1e0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a1f0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a200 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1a210 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
1a220 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
1a230 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
1a240 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a250 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
1a260 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
1a270 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
1a280 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
1a290 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
1a2a0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1a2b0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a2c0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
1a2d0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
1a2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a2f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1a300 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
1a310 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
1a320 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a340 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a350 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
1a360 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
1a370 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a380 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
1a390 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
1a3a0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
1a3b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
1a3c0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
1a3d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a3e0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
1a3f0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
1a400 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
1a410 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
1a420 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
1a430 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
1a440 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1a450 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
1a460 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1a470 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
1a480 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
1a490 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
1a4a0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
1a4b0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
1a4c0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
1a4d0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
1a4e0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
1a4f0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
1a500 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
1a510 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a520 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a530 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
1a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a550 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
1a560 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
1a570 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a590 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
1a5a0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a5b0 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
1a5c0 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
1a5d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1a5e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
1a5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a600 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
1a610 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
1a620 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
1a630 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1a640 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
1a650 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
1a660 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a670 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a680 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
1a690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
1a6b0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
1a6c0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1a6d0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
1a6e0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1a6f0 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
1a700 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
1a710 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
1a720 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
1a730 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
1a740 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
1a750 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
1a760 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
1a770 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
1a780 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
1a790 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
1a7a0 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
1a7b0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
1a7c0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
1a7d0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a7e0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
1a7f0 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
1a800 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
1a810 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
1a820 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a830 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
1a840 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
1a850 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
1a860 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
1a870 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
1a880 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
1a890 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
1a8a0 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
1a8b0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
1a8c0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
1a8d0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
1a8e0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
1a8f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
1a900 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1a910 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1a920 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
1a930 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1a950 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1a960 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
1a970 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
1a980 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
1a990 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
1a9a0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
1a9b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
1a9c0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1a9d0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
1a9e0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
1a9f0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1aa00 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
1aa10 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
1aa20 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
1aa30 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1aa50 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
1aa60 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
1aa70 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1aa80 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1aa90 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1aaa0 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
1aab0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
1aac0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1aad0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1aae0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1aaf0 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
1ab00 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1ab10 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1ab20 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ab30 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
1ab40 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
1ab50 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1ab60 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1ab70 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
1ab80 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
1ab90 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
1aba0 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
1abb0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
1abc0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1abd0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
1abe0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
1abf0 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
1ac00 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
1ac10 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
1ac20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ac30 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
1ac40 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
1ac50 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
1ac60 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
1ac70 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1ac80 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1ac90 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1aca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1acb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1acc0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
1acd0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
1ace0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
1acf0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
1ad00 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad10 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
1ad20 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
1ad40 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
1ad50 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad60 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
1ad70 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1ad80 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
1ad90 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
1ada0 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
1adb0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1adc0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1add0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
1ade0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
1adf0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
1ae00 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1ae10 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ae20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae30 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1ae40 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
1ae50 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
1ae60 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
1ae70 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
1ae80 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
1ae90 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1aea0 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
1aeb0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
1aec0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
1aed0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
1aee0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
1aef0 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
1af00 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
1af10 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
1af20 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
1af30 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
1af40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
1af50 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
1af60 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
1af70 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
1af80 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
1af90 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
1afa0 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
1afb0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
1afc0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
1afd0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
1afe0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
1aff0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
1b000 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
1b010 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
1b020 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
1b030 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
1b040 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
1b050 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
1b060 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
1b070 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1b080 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
1b090 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1b0a0 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
1b0b0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
1b0c0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
1b0d0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
1b0e0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
1b0f0 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
1b100 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
1b110 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
1b120 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1b130 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
1b140 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
1b150 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
1b160 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
1b170 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
1b180 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
1b190 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
1b1a0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
1b1b0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
1b1c0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
1b1d0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
1b1e0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
1b1f0 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
1b200 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
1b210 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
1b220 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
1b230 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
1b240 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
1b250 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
1b260 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
1b270 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
1b280 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
1b290 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
1b2a0 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
1b2b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
1b2c0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
1b2d0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
1b2e0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
1b2f0 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
1b300 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
1b310 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
1b320 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
1b330 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
1b340 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
1b350 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
1b360 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
1b370 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
1b380 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
1b390 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
1b3a0 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
1b3b0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
1b3c0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
1b3d0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
1b3e0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
1b3f0 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
1b400 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
1b410 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
1b420 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
1b430 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
1b440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1b450 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
1b460 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
1b470 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
1b480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b490 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b4a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1b4b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b4c0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
1b4d0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
1b4e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1b4f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1b500 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
1b510 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
1b520 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
1b530 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1b540 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1b550 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
1b560 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
1b570 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
1b580 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
1b590 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
1b5a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1b5b0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1b5c0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
1b5d0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
1b5e0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
1b5f0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
1b600 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
1b610 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
1b620 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
1b630 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
1b640 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
1b650 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
1b660 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1b670 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1b680 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
1b690 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
1b6a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b6b0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b6c0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
1b6d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b6e0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
1b6f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b700 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
1b710 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b720 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
1b730 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b740 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
1b750 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b760 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
1b770 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b780 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1b790 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1b7a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
1b7b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b7c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b7d0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
1b7e0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b7f0 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
1b800 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b810 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
1b820 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b830 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
1b840 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
1b850 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
1b860 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b870 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
1b880 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b890 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1b8a0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
1b8b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b8c0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
1b8d0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
1b8e0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
1b8f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
1b900 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
1b910 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b920 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1b930 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
1b940 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b950 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
1b960 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b970 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
1b980 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b990 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
1b9a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b9b0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
1b9c0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9d0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
1b9e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b9f0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
1ba00 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
1ba10 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
1ba20 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
1ba30 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
1ba40 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
1ba50 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
1ba60 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1ba70 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
1ba80 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
1ba90 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
1baa0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
1bab0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
1bac0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
1bad0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
1bae0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
1baf0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
1bb00 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
1bb10 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1bb20 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
1bb30 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
1bb40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bb50 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1bb60 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
1bb70 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
1bb80 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
1bb90 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
1bba0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
1bbb0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
1bbc0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1bbe0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
1bbf0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
1bc00 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
1bc10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1bc20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
1bc30 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
1bc40 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
1bc50 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
1bc60 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
1bc70 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1bc80 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
1bc90 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1bca0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bcb0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
1bcc0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bcd0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
1bce0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
1bcf0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1bd00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1bd10 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1bd20 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
1bd30 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1bd40 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1bd50 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1bd60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bd70 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
1bd80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1bd90 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
1bda0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
1bdb0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
1bdc0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
1bdd0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
1bde0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
1bdf0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1be00 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
1be10 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
1be20 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
1be30 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
1be40 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
1be50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
1be60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1be70 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1be80 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
1be90 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
1bea0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
1beb0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
1bec0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
1bed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1bee0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1bef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bf00 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
1bf10 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
1bf20 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
1bf30 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
1bf40 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
1bf50 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
1bf60 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1bf70 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
1bf80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1bf90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
1bfa0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
1bfb0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1bfc0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
1bfd0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
1bfe0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
1bff0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
1c000 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
1c010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c020 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
1c030 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
1c040 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
1c050 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
1c060 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
1c070 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
1c080 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
1c090 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
1c0a0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
1c0b0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
1c0c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
1c0d0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1c0e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c0f0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1c100 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
1c110 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
1c120 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
1c130 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
1c140 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c150 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c160 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1c170 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c180 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
1c190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c1a0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
1c1b0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1c1c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c1d0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
1c1e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1c1f0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1c200 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1c210 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
1c220 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
1c230 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
1c240 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1c250 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1c260 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1c270 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c280 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1c290 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1c2a0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1c2b0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1c2c0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1c2d0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1c2e0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1c2f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c300 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1c310 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1c320 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1c330 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1c340 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1c350 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1c360 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1c370 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1c380 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1c390 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1c3a0 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1c3b0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1c3c0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1c3d0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1c3e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1c3f0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1c400 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1c410 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1c420 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1c430 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1c440 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1c450 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1c460 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1c470 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1c480 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1c490 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1c4a0 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1c4b0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1c4c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c4d0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1c4e0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1c4f0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1c500 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1c510 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1c520 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1c530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c540 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c550 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1c560 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1c570 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1c580 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c590 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1c5a0 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1c5b0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1c5c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1c5d0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1c5e0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1c5f0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1c600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c610 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1c620 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1c630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c640 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1c650 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1c660 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c670 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1c680 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1c690 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1c6a0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1c6b0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1c6c0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1c6d0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c6e0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1c6f0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1c700 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1c710 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1c720 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1c730 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1c740 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1c750 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1c760 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1c770 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1c780 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1c790 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1c7a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c7b0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1c7c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1c7d0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1c7e0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1c7f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c800 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1c810 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1c820 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1c830 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1c840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c850 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c860 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1c870 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1c880 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1c890 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1c8a0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1c8b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c8c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1c8d0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1c8e0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1c8f0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1c900 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1c910 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1c920 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1c930 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1c940 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1c950 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1c960 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1c970 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1c980 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1c990 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1c9a0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1c9b0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1c9c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1c9d0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1c9e0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1c9f0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1ca00 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1ca10 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1ca20 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1ca30 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1ca40 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1ca50 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1ca60 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1ca70 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1ca80 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1ca90 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1caa0 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1cab0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1cac0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1cad0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1cae0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1caf0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1cb00 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1cb10 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1cb30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb50 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1cb60 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1cb70 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1cb80 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1cbb0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1cbc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbd0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1cbe0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1cbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1cc00 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1cc10 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1cc20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1cc30 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1cc40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1cc50 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1cc60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc70 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1cc80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cc90 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1cca0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1ccb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ccc0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1ccd0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1cce0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1ccf0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1cd00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1cd10 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1cd20 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1cd30 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69  ddrB);..  Explai
1cd40 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1cd50 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25  se, 1, "MERGE (%
1cd60 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  s)", selectOpNam
1cd70 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f  e(p->op)));..  /
1cd80 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1cd90 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1cda0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1cdb0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1cdc0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1cdd0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1cde0 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1cdf0 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1ce00 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1ce10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1ce20 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1ce30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ce40 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1ce50 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce60 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1ce70 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1ce80 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1ce90 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1cea0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1ceb0 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  itA;.  ExplainQu
1cec0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1ced0 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20   1, "LEFT"));.  
1cee0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1cef0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
1cf00 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
1cf10 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1cf20 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  (v, regAddrA);. 
1cf30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1cf40 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1cf50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1cf60 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1cf70 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1cf80 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
1cf90 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
1cfa0 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
1cfb0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1cfc0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1cfd0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1cfe0 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1cff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d000 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1d010 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
1d020 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
1d030 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d040 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
1d050 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
1d060 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
1d070 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
1d080 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
1d090 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1d0a0 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
1d0b0 3d 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e  = 0;  .  Explain
1d0c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1d0d0 65 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b  e, 1, "RIGHT"));
1d0e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1d0f0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
1d100 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
1d110 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
1d120 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
1d130 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
1d140 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1d150 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42  tine(v, regAddrB
1d160 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d170 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d180 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
1d190 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
1d1a0 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
1d1b0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
1d1c0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
1d1d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
1d1e0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d1f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1d200 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
1d210 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
1d220 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d230 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d240 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d250 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
1d260 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d290 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
1d2a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d2b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d2c0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d2d0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
1d2e0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d2f0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d300 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d310 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d320 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1d330 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1d340 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
1d350 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1d360 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1d370 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
1d380 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
1d390 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
1d3a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1d3b0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
1d3c0 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
1d3d0 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
1d3e0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
1d3f0 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
1d400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
1d410 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
1d420 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
1d430 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d440 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1d450 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1d460 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
1d470 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1d480 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1d490 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
1d4a0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
1d4b0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
1d4c0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1d4d0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d4e0 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
1d4f0 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
1d500 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d510 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
1d520 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d530 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
1d540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d550 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d560 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1d570 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1d580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d590 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d5a0 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1d5b0 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1d5e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d5f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d600 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1d610 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1d620 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1d630 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
1d640 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
1d650 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ctRow);.  }..  /
1d660 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d670 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d680 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d690 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1d6a0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d6b0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d6c0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1d6d0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d6e0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d6f0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1d700 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1d710 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1d720 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1d730 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1d740 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1d750 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1d760 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1d770 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d780 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1d790 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1d7a0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1d7b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1d7c0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1d7d0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1d7e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7f0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d800 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1d810 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d830 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1d840 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d850 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1d860 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1d870 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1d880 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d890 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1d8a0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1d8b0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1d8c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d8d0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1d8e0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1d8f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d900 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d910 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1d920 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d930 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d940 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1d950 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d960 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1d970 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1d980 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1d990 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1d9a0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d9b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1d9c0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d9d0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1d9e0 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1d9f0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1da00 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1da10 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1da20 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1da30 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1da40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1da50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da60 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da70 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1da90 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1daa0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1dab0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1dac0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1dad0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1dae0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1daf0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1db00 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1db10 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1db20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1db30 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1db40 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1db50 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1db60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1db80 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1db90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1dba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dbb0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1dbc0 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1dbd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1dbe0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1dbf0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1dc00 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1dc10 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1dc20 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1dc30 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1dc40 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1dc50 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1dc60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc70 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dc80 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1dc90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dca0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dcb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dcc0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dcd0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dce0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1dcf0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1dd00 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1dd10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1dd20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1dd30 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1dd40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dd50 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1dd60 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1dd70 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1dd80 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1dd90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dda0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1ddb0 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1ddc0 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1ddd0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1ddf0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1de00 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1de10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1de20 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1de30 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1de40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1de50 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1de60 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1de70 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1de80 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1de90 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1dea0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1deb0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1dec0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1ded0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1dee0 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1def0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1df00 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1df10 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1df20 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1df30 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1df40 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1df50 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1df60 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1df70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1df80 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1df90 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1dfa0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1dfb0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1dfc0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1dfd0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1dfe0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1dff0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1e000 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1e010 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1e020 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1e030 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Pop(pParse);.  r
1e040 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1e050 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1e060 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1e070 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1e080 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1e090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1e0a0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1e0b0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1e0c0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1e0d0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1e0e0 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1e0f0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1e100 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1e110 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1e120 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1e130 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1e140 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1e150 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1e160 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1e170 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1e180 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1e190 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1e1a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1e1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e1c0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1e1d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1e1e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e1f0 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1e200 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1e210 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1e220 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1e230 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1e240 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1e250 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1e260 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1e270 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1e280 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1e290 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1e2a0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1e2b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e2c0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1e2d0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1e2e0 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1e2f0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1e300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1e310 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1e320 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1e330 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1e340 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1e350 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1e360 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1e370 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1e380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e390 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1e3a0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1e3b0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1e3c0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1e3d0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1e3e0 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1e3f0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1e400 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1e410 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1e420 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1e430 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1e440 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1e450 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1e460 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1e470 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1e480 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1e490 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1e4a0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1e4b0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1e4c0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1e4d0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1e4e0 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1e4f0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1e500 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1e510 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1e520 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1e530 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1e540 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1e550 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1e560 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1e570 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1e580 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1e590 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1e5a0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1e5b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1e5c0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1e5d0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1e5e0 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1e5f0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1e600 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1e610 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1e620 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1e630 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1e640 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1e650 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1e660 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1e670 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1e680 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1e690 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e6a0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1e6b0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52  .   && pExpr->iR
1e6c0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70  ightJoinTable==p
1e6d0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20  Subst->iTable.  
1e6e0 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52  ){.    pExpr->iR
1e6f0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1e700 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1e710 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  e;.  }.  if( pEx
1e720 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1e730 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1e740 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e750 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
1e760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
1e770 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
1e780 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
1e790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
1e7a0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
1e7b0 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53  Expr *pCopy = pS
1e7c0 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ubst->pEList->a[
1e7d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1e7e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1e7f0 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20  r ifNullRow;.   
1e800 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73     assert( pSubs
1e810 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t->pEList!=0 && 
1e820 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1e830 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Subst->pEList->n
1e840 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1e850 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
1e860 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1e870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e880 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1e890 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e8a0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1e8b0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1e8c0 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1e8d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e8e0 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1e8f0 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1e900 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1e910 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1e920 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1e930 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1e940 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1e950 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1e960 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1e970 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e980 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1e990 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1e9a0 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1e9b0 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1e9c0 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1e9d0 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e9e0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1e9f0 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1ea00 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1ea10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1ea20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1ea30 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1ea40 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1ea50 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1ea60 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1ea70 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1ea80 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1ea90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1eaa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1eab0 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1eac0 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1ead0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1eae0 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1eaf0 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1eb00 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1eb10 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1eb20 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1eb30 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1eb40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eb50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eb60 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1eb80 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1eb90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1eba0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1ebb0 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1ebc0 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1ebd0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1ebe0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1ebf0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1ec00 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1ec10 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1ec20 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1ec30 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ec40 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1ec50 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1ec60 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ec70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1ec80 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ec90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1eca0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1ecb0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ecc0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ecd0 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1ece0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ecf0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1ed00 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1ed10 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1ed20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1ed30 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1ed40 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1ed50 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1ed60 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1ed70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1ed80 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1ed90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1eda0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1edb0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1edc0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1edd0 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1ede0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1edf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1ee00 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ee10 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ee20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ee30 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ee40 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1ee50 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1ee60 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee70 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1ee80 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1ee90 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1eea0 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1eeb0 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1eec0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1eed0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1eee0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1eef0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1ef00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1ef10 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1ef20 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1ef30 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1ef40 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1ef50 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1ef60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ef70 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1ef80 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1ef90 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1efa0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1efb0 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1efc0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1efd0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1efe0 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1eff0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f000 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1f010 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1f020 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f030 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1f040 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1f050 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f060 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1f070 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1f080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1f090 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1f0a0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1f0b0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1f0c0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1f0d0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1f0e0 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1f0f0 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1f100 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f110 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1f120 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1f130 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1f140 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f160 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1f170 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1f180 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1f190 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f1a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f1b0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f1c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f1d0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1f1e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f1f0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f210 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1f220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f230 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1f240 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1f250 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1f260 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1f270 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f280 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1f290 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1f2a0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1f2b0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1f2c0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1f2d0 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1f2e0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1f2f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1f300 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1f310 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1f320 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1f330 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f340 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1f350 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f360 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1f370 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1f380 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1f390 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1f3a0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1f3b0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1f3c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f3d0 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1f3e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1f3f0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1f400 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1f410 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1f420 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1f430 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1f440 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1f450 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1f460 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1f470 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f480 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1f490 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1f4a0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1f4b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1f4c0 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1f4d0 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1f4e0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1f4f0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1f500 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1f510 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1f520 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f530 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f540 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1f550 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1f560 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1f570 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1f580 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1f590 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1f5a0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1f5b0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1f5c0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1f5d0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1f5e0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1f5f0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1f600 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1f610 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1f620 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1f630 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1f640 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1f650 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1f660 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f670 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f680 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f690 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f6a0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1f6b0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1f6c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f6d0 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1f6e0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1f6f0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f700 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f710 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f720 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f730 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1f740 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f750 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1f760 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1f770 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f780 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1f790 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1f7a0 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1f7b0 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1f7c0 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1f7d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1f7e0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1f7f0 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1f800 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1f810 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1f820 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1f830 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1f840 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1f850 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1f860 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1f870 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1f880 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1f890 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1f8a0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f8b0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f8c0 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1f8d0 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1f8e0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f8f0 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1f900 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1f910 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f920 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1f930 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1f940 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1f950 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1f960 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1f970 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f980 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1f990 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1f9a0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1f9b0 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1f9c0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1f9d0 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1f9e0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1f9f0 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1fa00 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1fa10 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1fa20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1fa30 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1fa40 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1fa50 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1fa60 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1fa70 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1fa80 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1fa90 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1faa0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1fab0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1fac0 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1fad0 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1fae0 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1faf0 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1fb00 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1fb10 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1fb20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fb30 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1fb40 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1fb50 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fb60 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1fb70 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1fb80 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1fb90 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1fba0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1fbb0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1fbc0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1fbd0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1fbe0 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1fbf0 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1fc00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1fc10 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1fc20 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1fc30 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1fc40 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1fc50 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fc60 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fc70 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fc80 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1fc90 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1fca0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fcb0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fcc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fcd0 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1fce0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1fcf0 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1fd00 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1fd10 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1fd20 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1fd30 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1fd40 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1fd50 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1fd60 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1fd70 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1fd80 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1fd90 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1fda0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1fdb0 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1fdc0 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1fdd0 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1fde0 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1fdf0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1fe00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fe10 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1fe20 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1fe30 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1fe40 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1fe50 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1fe60 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1fe70 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1fe80 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1fe90 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1fea0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1feb0 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1fec0 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1fed0 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1fee0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fef0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1ff00 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1ff10 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1ff20 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1ff30 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1ff40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1ff50 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1ff60 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1ff70 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1ff80 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ff90 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1ffa0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1ffb0 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1ffc0 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1ffd0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1ffe0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1fff0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
20000 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
20010 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20020 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
20030 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
20040 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
20050 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
20060 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
20070 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
20080 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
20090 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
200a0 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
200b0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
200c0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
200d0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
200e0 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
200f0 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
20100 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
20110 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
20120 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
20130 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
20140 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
20150 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
20160 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
20170 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
20180 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
20190 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
201a0 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
201b0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
201c0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
201d0 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
201e0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
201f0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
20200 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
20210 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
20220 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
20230 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
20240 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
20250 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
20260 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
20270 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
20280 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
20290 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
202a0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
202b0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
202c0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
202d0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
202e0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
202f0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
20300 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
20310 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
20320 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
20330 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
20340 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
20350 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
20360 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
20370 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
20380 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
20390 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
203a0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
203b0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
203c0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
203d0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
203e0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
203f0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
20400 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20410 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
20420 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
20430 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
20440 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
20450 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
20460 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
20470 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20480 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
20490 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
204a0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
204b0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
204c0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
204d0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
204e0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
204f0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
20500 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
20510 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
20520 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
20530 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
20540 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
20550 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
20560 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20570 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
20580 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
20590 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
205a0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
205b0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
205c0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
205d0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
205e0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
205f0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
20600 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
20610 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
20620 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
20630 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
20640 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
20650 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
20660 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
20670 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
20680 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20690 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
206a0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
206b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
206c0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
206d0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
206e0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
206f0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
20700 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
20710 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20720 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20730 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
20740 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
20750 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
20760 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
20770 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20780 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
20790 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
207a0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
207b0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
207c0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
207d0 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
207e0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
207f0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20800 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20810 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
20820 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
20830 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
20840 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
20850 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20860 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
20870 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
20880 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
20890 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
208a0 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
208b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
208c0 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
208d0 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
208e0 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
208f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
20900 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
20910 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
20920 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
20930 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
20940 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
20950 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
20960 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
20970 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
20980 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
20990 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
209a0 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
209b0 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
209c0 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
209d0 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
209e0 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
209f0 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
20a00 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20a10 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20a20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20a30 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20a40 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
20a50 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
20a60 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
20a70 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
20a80 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
20a90 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
20aa0 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20ab0 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20ac0 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20ad0 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20ae0 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20af0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20b00 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20b10 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20  aximal.).**.**  
20b20 28 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20  (25)  If either 
20b30 74 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20  the subquery or 
20b40 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
20b50 20 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64   contains a wind
20b60 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e  ow.**        fun
20b70 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c  ction in the sel
20b80 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45  ect list or ORDE
20b90 52 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61  R BY clause, fla
20ba0 74 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ttening.**      
20bb0 20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74    is not attempt
20bc0 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  ed..**.**.** In 
20bd0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
20be0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
20bf0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20c00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20c10 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
20c20 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
20c30 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
20c40 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
20c50 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
20c60 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
20c70 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
20c80 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20c90 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
20ca0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
20cb0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
20cc0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
20cd0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
20ce0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
20cf0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
20d00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
20d10 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
20d20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
20d30 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
20d40 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
20d50 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
20d60 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
20d70 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
20d80 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
20d90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
20da0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20db0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
20dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20dd0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
20de0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20df0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20e10 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
20e20 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
20e30 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
20e40 6e 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20  nt isAgg        
20e50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
20e60 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
20e70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20e80 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
20e90 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
20ea0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
20eb0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
20ec0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
20ed0 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72  rent;    /* Curr
20ee0 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65  ent UNION ALL te
20ef0 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  rm of the other 
20f00 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63  query */.  Selec
20f10 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
20f20 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
20f30 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
20f40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
20f50 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
20f60 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
20f70 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
20f80 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
20f90 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
20fa0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
20fb0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20fc0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
20fd0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
20fe0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
20ff0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
21000 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
21010 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
21020 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
21030 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
21040 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
21050 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
21060 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a  ewParent = -1;/*
21070 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62   Replacement tab
21080 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a  le for iParent *
21090 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
210a0 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  in = 0; /* True 
210b0 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72  if pSub is the r
210c0 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c  ight side of a L
210d0 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a  EFT JOIN */    .
210e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
210f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21100 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
21110 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
21120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21130 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21140 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21150 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
21160 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
21170 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
21180 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21190 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
211a0 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
211b0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
211c0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
211d0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
211e0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
211f0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
21200 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74  ==0 );.  if( Opt
21210 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
21220 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
21230 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
21240 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
21250 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
21260 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
21270 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
21280 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
21290 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
212a0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
212b0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
212c0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
212d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
212e0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
212f0 70 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e  pSub!=0 );..#ifn
21300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21310 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
21320 20 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62   p->pWin || pSub
21330 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20  ->pWin ) return 
21340 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21350 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21360 6f 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69  on (25) */.#endi
21370 66 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  f..  pSubSrc = p
21380 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
21390 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
213a0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
213b0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
213c0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
213d0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
213e0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
213f0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
21400 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
21410 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
21420 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
21430 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21440 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
21450 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
21460 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
21470 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
21480 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21490 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
214a0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
214b0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
214c0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
214d0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
214e0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
214f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
21500 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
21510 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21520 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21530 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
21540 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
21550 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
21560 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
21570 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21580 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
21590 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
215a0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
215b0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
215c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21600 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
21610 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21620 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
21630 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21650 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
21660 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
21670 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21680 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
21690 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
216a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
216b0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
216c0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
216d0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
216e0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
216f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
21700 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
21710 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
21720 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
21730 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21740 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21780 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
21790 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
217a0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
217b0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
217e0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
217f0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
21800 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
21810 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21820 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21830 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
21840 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
21850 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21860 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
21870 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21880 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21890 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
218a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
218b0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
218c0 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
218d0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
218e0 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
218f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
21900 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21910 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21920 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21930 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
21940 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
21950 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
21960 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
21970 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
21980 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
21990 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
219a0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
219b0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
219c0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
219d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
219e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
219f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
21a00 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
21a10 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
21a20 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
21a30 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
21a40 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
21a50 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
21a60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21a70 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21a80 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21a90 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
21aa0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
21ab0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
21ac0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
21ad0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
21ae0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
21af0 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
21b00 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
21b10 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
21b20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
21b30 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
21b40 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
21b50 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
21b60 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
21b70 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
21b80 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
21b90 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
21ba0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
21bb0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
21bc0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
21bd0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
21be0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
21bf0 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
21c00 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
21c10 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
21c20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
21c30 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
21c40 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
21c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21c60 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21c70 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
21c80 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
21c90 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
21ca0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
21cb0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
21cc0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
21cd0 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21ce0 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21cf0 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21d00 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21d10 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21d20 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21d30 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21d40 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21d50 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
21d60 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
21d70 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
21d80 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
21d90 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
21da0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
21db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21dc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21dd0 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21de0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21df0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21e00 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21e10 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21e20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21e30 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21e40 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21e50 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
21e60 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
21e70 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
21e80 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
21e90 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
21ea0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
21eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21ec0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21ed0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21ee0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21ef0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21f00 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21f10 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21f20 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21f30 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21f40 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21f50 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
21f60 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
21f70 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
21f80 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
21f90 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
21fa0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
21fb0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
21fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21fd0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21fe0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21ff0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
22000 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
22010 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22020 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22030 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22040 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22050 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
22060 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
22070 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
22080 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
22090 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
220a0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
220b0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
220c0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
220d0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
220e0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
220f0 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
22100 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
22110 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
22120 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
22150 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
22160 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22190 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
221a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
221b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
221c0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
221d0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
221e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
221f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
22200 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
22210 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22220 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
22230 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
22240 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
22250 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
22260 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
22270 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
22280 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
22290 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
222a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
222b0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
222c0 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
222d0 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
222e0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
222f0 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
22300 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
22310 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
22320 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
22330 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
22340 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
22350 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22360 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
22370 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
22380 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
22390 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
223a0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
223b0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
223c0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
223d0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
223e0 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
223f0 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
22400 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
22410 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
22420 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
22430 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
22440 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
22450 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
22460 25 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %u.%p from term 
22470 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
22480 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
22490 73 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72  selId, pSub, iFr
224a0 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
224b0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
224c0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
224d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
224e0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
224f0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
22500 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22510 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22520 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
22530 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
22540 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
22550 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22560 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
22570 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
22580 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
22590 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
225a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
225b0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
225c0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
225d0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
225e0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
225f0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
22600 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
22610 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
22620 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
22630 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
22640 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
22650 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
22660 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
22670 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
22680 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
22690 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
226a0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
226b0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
226c0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
226d0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
226e0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
226f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
22700 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
22710 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
22720 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
22730 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
22740 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
22750 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
22760 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
22770 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
22780 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
22790 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
227a0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
227b0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
227c0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
227d0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
227e0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
227f0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
22800 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
22810 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
22820 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22830 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
22840 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
22850 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22860 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
22870 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
22880 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
22890 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
228a0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
228b0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
228c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
228d0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
228e0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
228f0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
22900 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
22910 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
22920 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
22930 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
22940 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22950 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
22960 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
22970 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
22980 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
22990 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
229a0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
229b0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
229c0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
229d0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
229e0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
229f0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
22a00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
22a10 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
22a20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
22a30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
22a40 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
22a50 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
22a60 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
22a70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
22a80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22a90 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
22aa0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22ab0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
22ac0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
22ad0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
22ae0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
22af0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
22b00 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22b10 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
22b20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
22b30 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
22b40 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
22b50 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
22b60 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22b70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
22b80 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
22b90 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
22ba0 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
22bb0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22bc0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
22bd0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
22be0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
22bf0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
22c00 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
22c10 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
22c20 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20  ery flattener". 
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63               " c
22c50 72 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65  reates %u as pee
22c60 72 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64  r\n",pNew->selId
22c70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
22c80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
22c90 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
22ca0 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
22cb0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
22cc0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
22cd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22ce0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
22cf0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
22d00 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
22d10 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
22d20 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
22d30 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
22d40 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
22d50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22d60 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
22d70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
22d80 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22d90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
22da0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22db0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
22dc0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
22dd0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22de0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
22df0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22e00 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
22e10 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
22e20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22e30 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22e40 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
22e50 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
22e60 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
22e70 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
22e80 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22e90 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
22ea0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
22eb0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
22ec0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
22ed0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
22ee0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
22ef0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
22f00 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
22f10 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
22f20 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
22f30 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
22f40 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
22f50 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
22f60 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
22f70 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
22f80 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
22f90 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
22fa0 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
22fb0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
22fc0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
22fd0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
22fe0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
22ff0 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
23000 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23010 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23020 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
23030 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
23040 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
23050 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
23060 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
23070 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
23080 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
23090 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
230a0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
230b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
230c0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
230d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
230e0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
230f0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
23100 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
23110 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
23120 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
23130 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
23140 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
23150 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
23160 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
23170 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
23180 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
23190 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
231a0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
231b0 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
231c0 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
231d0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
231e0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
231f0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
23200 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
23210 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23220 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
23230 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
23240 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
23250 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
23260 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
23270 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
23280 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
23290 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
232a0 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
232b0 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
232c0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
232d0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
232e0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
232f0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
23300 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
23310 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
23320 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
23330 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
23340 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
23350 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
23360 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
23370 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
23380 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
23390 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
233a0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
233b0 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
233c0 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
233d0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
233e0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
233f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
23400 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
23410 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
23420 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
23430 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
23440 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
23450 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
23460 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
23470 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
23480 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
23490 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
234a0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
234b0 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
234c0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
234d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
234e0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
234f0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
23500 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
23510 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
23520 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
23530 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
23540 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
23550 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
23560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23570 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
23580 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
23590 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
235a0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
235b0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
235c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
235d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
235e0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
235f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
23600 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
23610 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
23620 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
23630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23640 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23650 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
23660 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
23670 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23680 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23690 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
236a0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
236b0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
236c0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
236d0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
236e0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
236f0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
23700 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
23710 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
23720 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
23730 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
23740 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
23750 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
23760 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
23770 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
23780 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
23790 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
237a0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
237b0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
237c0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
237d0 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
237e0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
237f0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23800 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
23810 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
23820 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
23830 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
23840 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
23850 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
23860 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
23870 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
23880 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
23890 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
238a0 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
238b0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
238c0 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
238d0 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
238e0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
238f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23900 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
23910 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
23920 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
23930 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
23940 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23950 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
23960 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
23970 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
23980 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23990 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
239a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
239b0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
239c0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
239d0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
239e0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
239f0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
23a00 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23a20 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23a30 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23a40 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23a50 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23a60 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23a70 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23a80 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23a90 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23aa0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23ab0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23ac0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23ad0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23ae0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23af0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23b00 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23b10 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23b20 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23b30 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23b40 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23b50 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23b60 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23b70 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23b80 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23b90 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23ba0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23bb0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23bc0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23bd0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23be0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23bf0 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23c00 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23c10 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23c20 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23c30 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23c40 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23c50 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23c60 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23c70 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23c80 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23c90 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23ca0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23cb0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23cc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23cd0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23ce0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23cf0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23d00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23d10 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23d20 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23d30 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23d40 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23d50 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23d60 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23d70 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23d80 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23d90 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23da0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23db0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23dc0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23dd0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23de0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23df0 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23e00 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23e10 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23e20 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23e30 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23e40 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23e50 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23e60 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23e70 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23e80 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23e90 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23ea0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23eb0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23ec0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23ed0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ee0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
23ef0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
23f00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23f10 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
23f20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
23f30 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
23f40 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
23f50 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
23f60 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
23f70 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
23f80 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
23f90 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
23fa0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
23fb0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
23fc0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
23fd0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
23fe0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
23ff0 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
24000 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24010 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24020 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24030 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24040 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24050 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24060 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24070 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24080 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
24090 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
240a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
240b0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
240c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
240d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
240e0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
240f0 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
24100 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24110 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24130 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
24140 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  e, 0);.    if( i
24150 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20  sLeftJoin>0 ){. 
24160 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
24170 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72  (pWhere, iNewPar
24180 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ent);.    }.    
24190 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
241a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
241b0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
241c0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
241d0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
241e0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
241f0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
24200 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
24210 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24220 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
24230 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24240 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
24250 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24260 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
24270 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
24280 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
24290 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
242a0 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
242b0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
242c0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
242d0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
242e0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
242f0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
24300 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
24310 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
24320 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
24330 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
24340 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
24350 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24360 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
24370 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
24380 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
24390 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
243a0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
243b0 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
243c0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
243d0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
243e0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
243f0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
24400 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
24410 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
24420 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
24430 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
24440 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
24450 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
24460 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
24470 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
24480 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
24490 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
244a0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
244b0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
244c0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
244d0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
244e0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
244f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
24500 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
24510 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
24520 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
24530 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
24540 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
24550 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
24560 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
24570 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
24580 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
24590 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
245a0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
245b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
245c0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
245d0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
245e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
245f0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
24600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24610 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72   */../*.** A str
24620 75 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74  ucture to keep t
24630 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74  rack of all of t
24640 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
24650 20 74 68 61 74 20 61 72 65 20 66 69 78 65 64 20   that are fixed 
24660 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61  to.** a known va
24670 6c 75 65 20 64 75 65 20 74 6f 20 57 48 45 52 45  lue due to WHERE
24680 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
24690 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
246a0 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f  COLUMN=VALUE..*/
246b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
246c0 57 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65  WhereConst Where
246d0 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68  Const;.struct Wh
246e0 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72  ereConst {.  Par
246f0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a  se *pParse;   /*
24700 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
24710 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
24720 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
24730 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53   for COLUMN=CONS
24740 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20  TANT terms */.  
24750 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20  int nChng;      
24760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
24770 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  mes a constant i
24780 73 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a  s propagated */.
24790 20 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b    Expr **apExpr;
247a0 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43     /* [i*2] is C
247b0 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31  OLUMN and [i*2+1
247c0 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b  ] is VALUE */.};
247d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
247e0 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  w entry to the p
247f0 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45  Const object.  E
24800 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64  xcept, do not ad
24810 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70  d duplicate.** p
24820 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a  Column entires..
24830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
24840 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68  onstInsert(.  Wh
24850 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74  ereConst *pConst
24860 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  ,      /* The Wh
24870 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68  ereConst into wh
24880 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72  ich we are inser
24890 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ting */.  Expr *
248a0 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  pColumn,        
248b0 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e     /* The COLUMN
248c0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e   part of the con
248d0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70  straint */.  Exp
248e0 72 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20  r *pValue       
248f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c        /* The VAL
24900 55 45 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  UE part of the c
24910 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
24920 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
24930 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d  t( pColumn->op==
24940 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20  TK_COLUMN );..  
24950 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69  /* 2018-10-25 ti
24960 63 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a  cket [cf5ed20f].
24970 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    ** Make sure t
24980 68 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20  he same pColumn 
24990 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20  is not inserted 
249a0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a  more than once *
249b0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
249c0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69  Const->nConst; i
249d0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ++){.    const E
249e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f  xpr *pExpr = pCo
249f0 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d  nst->apExpr[i*2]
24a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
24a10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
24a20 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  MN );.    if( pE
24a30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f  xpr->iTable==pCo
24a40 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20  lumn->iTable.   
24a50 20 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c    && pExpr->iCol
24a60 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43  umn==pColumn->iC
24a70 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
24a80 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41     return;  /* A
24a90 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20  lready present. 
24aa0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
24ab0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
24ac0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
24ad0 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b  pConst->nConst++
24ae0 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  ;.  pConst->apEx
24af0 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  pr = sqlite3DbRe
24b00 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e  allocOrFree(pCon
24b10 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  st->pParse->db, 
24b20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a  pConst->apExpr,.
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d           pConst-
24b50 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66  >nConst*2*sizeof
24b60 28 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20  (Expr*));.  if( 
24b70 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d  pConst->apExpr==
24b80 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d  0 ){.    pConst-
24b90 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d  >nConst = 0;.  }
24ba0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78  else{.    if( Ex
24bb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 56  prHasProperty(pV
24bc0 61 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f  alue, EP_FixedCo
24bd0 6c 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56  l) ) pValue = pV
24be0 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  alue->pLeft;.   
24bf0 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
24c00 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24c10 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  -2] = pColumn;. 
24c20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70     pConst->apExp
24c30 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  r[pConst->nConst
24c40 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a  *2-1] = pValue;.
24c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
24c60 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43  d all terms of C
24c70 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56  OLUMN=VALUE or V
24c80 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70  ALUE=COLUMN in p
24c90 45 78 70 72 20 77 68 65 72 65 20 56 41 4c 55 45  Expr where VALUE
24ca0 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  .** is a constan
24cb0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  t expression and
24cc0 20 77 68 65 72 65 20 74 68 65 20 74 65 72 6d 20   where the term 
24cd0 6d 75 73 74 20 62 65 20 74 72 75 65 20 62 65 63  must be true bec
24ce0 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61  ause it.** is pa
24cf0 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f  rt of the AND-co
24d00 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66  nnected terms of
24d10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
24d20 20 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a    For each term.
24d30 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74  ** found, add it
24d40 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73   to the pConst s
24d50 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
24d60 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e  tic void findCon
24d70 73 74 49 6e 57 68 65 72 65 28 57 68 65 72 65 43  stInWhere(WhereC
24d80 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78  onst *pConst, Ex
24d90 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
24da0 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
24db0 66 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  ft;.  if( pExpr=
24dc0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
24dd0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24de0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
24df0 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b  mJoin) ) return;
24e00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
24e10 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
24e20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24e30 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24e40 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e  pRight);.    fin
24e50 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43  dConstInWhere(pC
24e60 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  onst, pExpr->pLe
24e70 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ft);.    return;
24e80 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
24e90 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65  ->op!=TK_EQ ) re
24ea0 74 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d  turn;.  pRight =
24eb0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
24ec0 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
24ed0 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74  >pLeft;.  assert
24ee0 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ( pRight!=0 );. 
24ef0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
24f00 30 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68  0 );.  if( pRigh
24f10 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
24f20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
24f30 72 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c 20  roperty(pRight, 
24f40 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20  EP_FixedCol).   
24f50 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24f60 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a  Constant(pLeft).
24f70 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42     && sqlite3IsB
24f80 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e  inary(sqlite3Bin
24f90 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
24fa0 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  q(pConst->pParse
24fb0 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a  ,pLeft,pRight)).
24fc0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e    ){.    constIn
24fd0 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69  sert(pConst, pRi
24fe0 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  ght, pLeft);.  }
24ff0 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74  else.  if( pLeft
25000 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
25010 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
25020 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50  operty(pLeft, EP
25030 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26  _FixedCol).   &&
25040 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25050 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20  nstant(pRight). 
25060 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69    && sqlite3IsBi
25070 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61  nary(sqlite3Bina
25080 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
25090 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c  (pConst->pParse,
250a0 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20  pLeft,pRight)). 
250b0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73   ){.    constIns
250c0 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66  ert(pConst, pLef
250d0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
250e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
250f0 20 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73   a Walker expres
25100 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20  sion callback.  
25110 70 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69  pExpr is a candi
25120 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  date expression.
25130 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  ** to be replace
25140 64 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49  d by a value.  I
25150 66 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76  f pExpr is equiv
25160 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20  alent to one of 
25170 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e  the.** columns n
25180 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d  amed in pWalker-
25190 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20  >u.pConst, then 
251a0 6f 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74  overwrite it wit
251b0 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70  h its.** corresp
251c0 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f  onding value..*/
251d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70  .static int prop
251e0 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70  agateConstantExp
251f0 72 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20  rRewrite(Walker 
25200 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
25210 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
25220 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
25230 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78  Const;.  if( pEx
25240 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
25250 4e 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  N ) return WRC_C
25260 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45  ontinue;.  if( E
25270 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25280 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
25290 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
252a0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e  Continue;.  pCon
252b0 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  st = pWalker->u.
252c0 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pConst;.  for(i=
252d0 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f  0; i<pConst->nCo
252e0 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  nst; i++){.    E
252f0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70  xpr *pColumn = p
25300 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a  Const->apExpr[i*
25310 32 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  2];.    if( pCol
25320 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e  umn==pExpr ) con
25330 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
25340 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d  Column->iTable!=
25350 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
25360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
25370 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75  ( pColumn->iColu
25380 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn!=pExpr->iColu
25390 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
253a0 20 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73     /* A match is
253b0 20 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65   found.  Add the
253c0 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f   EP_FixedCol pro
253d0 70 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f  perty */.    pCo
253e0 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20  nst->nChng++;.  
253f0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
25400 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65  rty(pExpr, EP_Le
25410 61 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  af);.    ExprSet
25420 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25430 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20  EP_FixedCol);.  
25440 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25450 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
25460 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
25470 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
25480 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Const->pParse->d
25490 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  b, pConst->apExp
254a0 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20  r[i*2+1], 0);.  
254b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
254c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
254d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48  .}../*.** The WH
254e0 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE-clause const
254f0 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
25500 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
25510 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
25520 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
25530 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
25540 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41  rm COLUMN=CONSTA
25550 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e  NT or.** CONSTAN
25560 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75  T=COLUMN that mu
25570 73 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f  st be tree (in o
25580 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
25590 68 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76  he terms top-lev
255a0 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63  el.** AND-connec
255b0 74 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  ted terms that a
255c0 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  re not part of a
255d0 20 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   ON clause from 
255e0 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20  a LEFT JOIN).** 
255f0 74 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20  then throughout 
25600 74 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63  the query replac
25610 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75  e all other occu
25620 72 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d  rrences of COLUM
25630 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41  N.** with CONSTA
25640 4e 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  NT within the WH
25650 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
25660 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
25670 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
25680 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25690 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
256a0 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
256b0 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33  t2.b=t1.a AND t3
256c0 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73  .c=t2.b.**.** Is
256d0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
256e0 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  o.**.**      SEL
256f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
25700 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
25710 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20  =39 AND t2.b=39 
25720 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a  AND t3.c=39.**.*
25730 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
25740 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74   any transformat
25750 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20  ions where made 
25760 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
25770 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
25780 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f  tation note:  Co
25790 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
257a0 6f 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65  on is tricky due
257b0 20 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20   to affinity.** 
257c0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
257d0 71 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69  quence interacti
257e0 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  ons.  Consider t
257f0 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  his example:.**.
25800 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  **    CREATE TAB
25810 4c 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45  LE t1(a INT,b TE
25820 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52  XT);.**    INSER
25830 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
25840 28 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a  (123,'0123');.**
25850 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25860 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33  M t1 WHERE a=123
25870 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20   AND b=a;.**    
25880 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25890 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44   WHERE a=123 AND
258a0 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68   b=123;.**.** Th
258b0 65 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61  e two SELECT sta
258c0 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68  tements above sh
258d0 6f 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66  ould return diff
258e0 65 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20  erent answers.  
258f0 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20  b=a.** is alway 
25900 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
25910 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73   comparison uses
25920 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
25930 79 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20  y, but b=123.** 
25940 69 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65  is false because
25950 20 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66   it uses text af
25960 66 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33  finity and '0123
25970 27 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  ' is not the sam
25980 65 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54  e as '123'..** T
25990 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
259a0 69 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  is, the expressi
259b0 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61  on tree is not a
259c0 63 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20  ctually changed 
259d0 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f  from.** "b=a" to
259e0 20 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74   "b=123" but rat
259f0 68 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22  her the "a" in "
25a00 62 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77  b=a" is tagged w
25a10 69 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a  ith EP_FixedCol.
25a20 2a 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22  ** and the "123"
25a30 20 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f   value is hung o
25a40 66 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ff of the pLeft 
25a50 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67  pointer.  Code g
25a60 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74  enerator.** rout
25a70 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e  ines know to gen
25a80 65 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61  erate the consta
25a90 6e 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64  nt "123" instead
25aa0 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74   of looking up t
25ab0 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c  he.** column val
25ac0 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76  ue.  Also, to av
25ad0 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72  oid collation pr
25ae0 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74  oblems, this opt
25af0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20  imization is.** 
25b00 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
25b10 66 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65  f the "a=123" te
25b20 72 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61  rm uses the defa
25b30 75 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  ult BINARY colla
25b40 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
25b50 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  int propagateCon
25b60 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20  stants(.  Parse 
25b70 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68  *pParse,   /* Th
25b80 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
25b90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
25ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
25bb0 75 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  uery in which to
25bc0 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74   propagate const
25bd0 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ants */.){.  Whe
25be0 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c  reConst x;.  Wal
25bf0 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68  ker w;.  int nCh
25c00 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72  ng = 0;.  x.pPar
25c10 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64  se = pParse;.  d
25c20 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20  o{.    x.nConst 
25c30 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67  = 0;.    x.nChng
25c40 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78   = 0;.    x.apEx
25c50 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64  pr = 0;.    find
25c60 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c  ConstInWhere(&x,
25c70 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
25c80 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b   if( x.nConst ){
25c90 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77  .      memset(&w
25ca0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
25cb0 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20  .      w.pParse 
25cc0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
25cd0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
25ce0 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  = propagateConst
25cf0 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a  antExprRewrite;.
25d00 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25d10 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
25d20 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
25d30 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74  .      w.xSelect
25d40 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
25d50 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70       w.walkerDep
25d60 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e  th = 0;.      w.
25d70 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20  u.pConst = &x;. 
25d80 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25d90 45 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65  Expr(&w, p->pWhe
25da0 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
25db0 65 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73  e3DbFree(x.pPars
25dc0 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29  e->db, x.apExpr)
25dd0 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d  ;.      nChng +=
25de0 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a   x.nChng;.    }.
25df0 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e    }while( x.nChn
25e00 67 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  g );  .  return 
25e10 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64  nChng;.}..#if !d
25e20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25e30 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
25e40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25e50 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
25e60 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
25e70 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
25e80 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
25e90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
25ea0 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
25eb0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
25ec0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
25ed0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
25ee0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
25ef0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
25f00 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
25f10 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
25f20 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
25f30 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
25f40 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
25f50 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
25f60 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
25f70 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
25f80 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
25f90 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
25fa0 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
25fb0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
25fc0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
25fd0 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
25fe0 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
25ff0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
26000 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
26010 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
26020 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a  :.**.**   (1) (*
26030 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  * This restricti
26040 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f  on was removed o
26050 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57  n 2017-09-29.  W
26060 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20  e used to.**    
26070 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20         disallow 
26080 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
26090 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  n for aggregate 
260a0 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20  subqueries, but 
260b0 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
260c0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62   it is allowed b
260d0 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78  y putting the ex
260e0 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
260f0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a   HAVING clause..
26100 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65  **           The
26110 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c   added HAVING cl
26120 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73  ause is pointles
26130 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  s if the subquer
26140 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20  y lacks.**      
26150 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20       a GROUP BY 
26160 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63  clause.  But suc
26170 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  h a HAVING claus
26180 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65  e is also harmle
26190 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
261a0 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f  so there does no
261b0 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
261c0 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64  ny reason to add
261d0 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20   extra logic.** 
261e0 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70            to sup
261f0 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a  press it. **).**
26200 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
26210 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
26220 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
26230 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
26240 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
26250 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
26260 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
26270 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
26280 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
26290 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
262a0 20 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75        clause wou
262b0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
262c0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
262d0 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
262e0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
262f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
26300 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
26310 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20  JOIN and the.** 
26320 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
26330 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f   to be pushed do
26340 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  wn does not come
26350 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
26360 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20  use.**       on 
26370 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  that LEFT JOIN..
26380 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
26390 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
263a0 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
263b0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
263c0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
263d0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
263e0 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73  JOIN where iCurs
263f0 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  or is not the ri
26400 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
26410 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  f that.**       
26420 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65  left join.  An e
26430 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
26440 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
26450 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52  .**           FR
26460 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  OM (SELECT 1 AS 
26470 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  a1 UNION ALL SEL
26480 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20  ECT 2) AS aa.** 
26490 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28            JOIN (
264a0 53 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55  SELECT 1 AS b2 U
264b0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
264c0 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d  2) AS bb ON (a1=
264d0 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  b2).**          
264e0 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45   LEFT JOIN (SELE
264f0 43 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e  CT 8 AS c3 UNION
26500 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41   ALL SELECT 9) A
26510 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a  S cc ON (b2=2);.
26520 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  **.**       The 
26530 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69  correct answer i
26540 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28  s three rows:  (
26550 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38  1,1,NULL),(2,2,8
26560 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20  ),(2,2,9)..**   
26570 20 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28      But if the (
26580 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20  b2=2) term were 
26590 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
265a0 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75  n into the bb su
265b0 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20  bquery,.**      
265c0 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e   then the (1,1,N
265d0 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62  ULL) row would b
265e0 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a  e suppressed..**
265f0 0a 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e  .**   (6) The in
26600 6e 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72  ner query featur
26610 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77  es one or more w
26620 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
26630 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20  (since .**      
26640 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
26650 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
26660 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
26670 63 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  could change the
26680 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f   .**       windo
26690 77 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e  w over which win
266a0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
266b0 65 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a  e calculated)..*
266c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
266d0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
266e0 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
266f0 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
26700 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
26710 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
26720 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
26730 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
26740 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
26750 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72  hereTerms(.  Par
26760 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
26770 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
26780 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28  ext (for malloc(
26790 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f  ) and error repo
267a0 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65  rting) */.  Sele
267b0 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
267c0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
267d0 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
267e0 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
267f0 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
26800 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
26810 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
26820 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
26830 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
26840 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20  nt iCursor,     
26850 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
26860 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
26870 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
26880 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20  sLeftJoin       
26890 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62   /* True if pSub
268a0 71 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  q is the right t
268b0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
268c0 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  IN */.){.  Expr 
268d0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
268e0 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  ng = 0;.  if( pW
268f0 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  here==0 ) return
26900 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d   0;.  if( pSubq-
26910 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
26920 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72  ecursive ) retur
26930 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63  n 0;  /* restric
26940 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66  tion (2) */..#if
26950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26960 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66  _WINDOWFUNC.  if
26970 28 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20  ( pSubq->pWin ) 
26980 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
26990 72 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  restriction (6) 
269a0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  */.#endif..#ifde
269b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
269c0 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72   /* Only the fir
269d0 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d  st term of a com
269e0 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61  pound can have a
269f0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42   WITH clause.  B
26a00 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  ut make.  ** sur
26a10 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73  e no other terms
26a20 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52   are marked SF_R
26a30 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65  ecursive in case
26a40 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67   something chang
26a50 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  es.  ** in the f
26a60 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  uture..  */.  {.
26a70 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20      Select *pX; 
26a80 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75   .    for(pX=pSu
26a90 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  bq; pX; pX=pX->p
26aa0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73  Prior){.      as
26ab0 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c  sert( (pX->selFl
26ac0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
26ad0 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ive))==0 );.    
26ae0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26af0 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
26b00 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
26b10 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
26b20 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
26b30 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
26b40 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
26b50 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
26b60 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
26b70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57  Parse, pSubq, pW
26b80 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20  here->pRight,.  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
26bb0 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69  ursor, isLeftJoi
26bc0 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  n);.    pWhere =
26bd0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
26be0 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74    }.  if( isLeft
26bf0 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72  Join.   && (Expr
26c00 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
26c10 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d  re,EP_FromJoin)=
26c20 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
26c30 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
26c40 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29  nTable!=iCursor)
26c50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
26c60 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26c70 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (4) */.  }.  
26c80 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
26c90 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
26ca0 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72  omJoin) && pWher
26cb0 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
26cc0 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le!=iCursor ){. 
26cd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
26ce0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  restriction (5) 
26cf0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  */.  }.  if( sql
26d00 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
26d10 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
26d20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
26d30 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
26d40 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
26d50 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
26d60 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
26d70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
26d80 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
26d90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73  e, 0);.      uns
26da0 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c  etJoinExpr(pNew,
26db0 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50   -1);.      x.pP
26dc0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26dd0 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
26de0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
26df0 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75  .iNewTable = iCu
26e00 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73  rsor;.      x.is
26e10 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20  LeftJoin = 0;.  
26e20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
26e30 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Subq->pEList;.  
26e40 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
26e50 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a  Expr(&x, pNew);.
26e60 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d        if( pSubq-
26e70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
26e80 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
26e90 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69      pSubq->pHavi
26ea0 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
26eb0 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
26ec0 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20  pSubq->pHaving, 
26ed0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pNew);.      }el
26ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62  se{.        pSub
26ef0 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
26f00 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
26f10 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57  e->db, pSubq->pW
26f20 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
26f30 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71     }.      pSubq
26f40 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
26f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26f60 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
26f70 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
26f80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
26f90 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
26fa0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26fb0 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IEW) */../*.** T
26fc0 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20  he pFunc is the 
26fd0 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66  only aggregate f
26fe0 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71  unction in the q
26ff0 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20  uery.  Check to 
27000 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75  see.** if the qu
27010 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27020 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27030 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ax optimization.
27040 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71   .**.** If the q
27050 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
27060 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
27070 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
27080 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70  , then set.** *p
27090 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e  pMinMax to be an
270a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
270b0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
270c0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
270d0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65  .** and return e
270e0 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45  ither WHERE_ORDE
270f0 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
27100 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70  _ORDERBY_MAX dep
27110 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65  ending on.** whe
27120 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20  ther pFunc is a 
27130 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
27140 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
27150 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e  f the query is n
27160 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  ot 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 72 65 74  ptimization, ret
27190 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  urn.** WHERE_ORD
271a0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69  ERBY_NORMAL (whi
271b0 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29  ch must be zero)
271c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
271d0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
271e0 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67  led after aggreg
271f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ate functions ha
27200 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74  ve been.** locat
27210 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27220 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61  eir arguments ha
27230 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65  ve been subjecte
27240 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a  d to aggregate.*
27250 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73  * analysis..*/.s
27260 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
27270 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  uery(sqlite3 *db
27280 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45  , Expr *pFunc, E
27290 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
272a0 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
272b0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
272c0 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20  NORMAL;      /* 
272d0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
272e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
272f0 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c  st = pFunc->x.pL
27300 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d  ist;    /* Argum
27310 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
27320 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
27330 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20  char *zFunc;    
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65  /* Name of aggre
27360 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46  gate function pF
27370 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  unc */.  ExprLis
27380 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75  t *pOrderBy;.  u
27390 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  8 sortOrder;..  
273a0 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
273b0 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
273c0 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f  ( pFunc->op==TK_
273d0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
273e0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
273f0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
27400 21 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65  !=1 ) return eRe
27410 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75  t;.  zFunc = pFu
27420 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  nc->u.zToken;.  
27430 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
27440 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
27450 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
27460 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
27470 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MIN;.    sortOrd
27480 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41  er = SQLITE_SO_A
27490 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SC;.  }else if( 
274a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
274b0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
274c0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
274d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
274e0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
274f0 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
27500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
27510 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20  turn eRet;.  }. 
27520 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72   *ppMinMax = pOr
27530 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
27540 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
27550 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73  EList, 0);.  ass
27560 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
27570 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
27580 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f  iled );.  if( pO
27590 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
275a0 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
275b0 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
275c0 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
275d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
275e0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
275f0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
27600 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
27610 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
27620 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
27630 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
27640 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
27650 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
27660 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
27670 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
27680 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
27690 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
276a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
276b0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
276c0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
276d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
276e0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
276f0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
27700 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
27710 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
27720 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
27730 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
27740 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
27750 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
27760 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
27770 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
27780 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
27790 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
277a0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
277b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
277c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
277d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
277e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
277f0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
27800 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
27810 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
27820 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
27830 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
27840 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
27850 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
27860 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
27870 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
27880 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
27890 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
278a0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
278b0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
278c0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
278d0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
278e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
278f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
27900 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
27910 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
27920 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
27930 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
27940 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
27950 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
27960 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
27970 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
27980 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
27990 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
279a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
279b0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
279c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
279d0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
279e0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
279f0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
27a00 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
27a10 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
27a20 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
27a30 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
27a40 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
27a50 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
27a60 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
27a70 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
27a80 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
27a90 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
27aa0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
27ab0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
27ac0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
27ad0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
27ae0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
27af0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
27b00 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
27b10 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
27b20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27b30 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
27b40 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
27b50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
27b60 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
27b70 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
27b80 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
27b90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27ba0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27bb0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
27bc0 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
27bd0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
27be0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
27bf0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
27c00 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
27c10 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
27c20 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
27c30 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
27c40 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
27c50 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
27c60 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
27c70 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
27c80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27c90 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
27ca0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
27cb0 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
27cc0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
27cd0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
27ce0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
27d00 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
27d10 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
27d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
27d30 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
27d40 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
27d50 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
27d60 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
27d70 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
27d80 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
27d90 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
27da0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
27db0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
27dc0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27dd0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
27de0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
27df0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
27e00 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
27e10 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
27e20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
27e30 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
27e40 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
27e50 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
27e60 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
27e70 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
27e80 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27e90 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
27ea0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
27eb0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
27ec0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
27ed0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
27ee0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
27ef0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
27f00 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
27f10 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
27f20 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
27f30 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
27f40 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
27f50 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
27f60 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
27f70 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
27f80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27f90 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
27fa0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
27fb0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
27fc0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
27fd0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27fe0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
27ff0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
28000 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
28010 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
28020 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
28030 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
28040 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
28050 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
28060 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
28070 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
28080 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
28090 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
280a0 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
280b0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
280c0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
280d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
280e0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
280f0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
28100 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
28110 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
28120 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
28130 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
28140 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
28150 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
28160 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
28170 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28180 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
28190 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
281a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
281b0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
281c0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
281d0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
281e0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
281f0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
28200 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
28210 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
28220 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
28230 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
28240 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
28250 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28260 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
28270 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
28280 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
28290 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
282a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
282b0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
282c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
282d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
282e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
282f0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
28300 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
28310 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
28320 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28330 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
28340 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28350 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
28360 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
28370 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28380 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
28390 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
283a0 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
283b0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
283c0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
283d0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
283e0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
283f0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
28400 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
28410 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
28420 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
28430 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
28440 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
28450 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
28460 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
28470 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
28480 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
28490 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
284a0 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
284b0 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
284c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
284d0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
284e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
284f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
28500 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
28510 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
28520 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
28530 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
28540 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28550 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
28560 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
28570 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
28580 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
28590 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
285a0 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
285b0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
285c0 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
285d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74  Limit = 0;.  ret
285e0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
285f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
28600 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
28610 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
28620 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
28630 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
28640 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
28650 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
28660 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28670 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
28680 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
28690 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
286a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
286b0 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
286c0 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
286d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
286e0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
286f0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
28700 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28710 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
28720 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
28730 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
28740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28750 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
28760 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
28770 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
28780 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28790 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
287a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
287b0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
287c0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
287d0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
287e0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
287f0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
28800 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
28810 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
28820 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
28830 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
28840 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
28850 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
28860 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
28870 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
28880 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
28890 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
288a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
288b0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
288c0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
288d0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
288e0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
288f0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
28900 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
28910 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
28920 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
28930 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
28940 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
28950 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
28960 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
28970 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
28980 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
289b0 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
289c0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
289d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
289e0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
289f0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
28a00 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
28a10 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
28a40 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
28a50 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
28a60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28a70 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
28a80 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
28a90 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
28aa0 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
28ab0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
28ac0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
28ad0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
28ae0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
28b00 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
28b10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28b20 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
28b30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
28b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
28b50 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
28b60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
28b70 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
28b80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28ba0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
28bb0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
28bc0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
28bd0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
28be0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
28bf0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
28c00 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
28c10 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
28c20 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
28c30 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
28c40 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
28c50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28c60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
28c70 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
28c80 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
28c90 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
28ca0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
28cb0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
28cc0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
28cd0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
28ce0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
28cf0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
28d00 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
28d10 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
28d20 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
28d30 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
28d40 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
28d50 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
28d60 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
28d70 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
28d80 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
28d90 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
28da0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
28db0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
28dc0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
28dd0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
28de0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
28df0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
28e00 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
28e10 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
28e20 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
28e30 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
28e40 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
28e50 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
28e60 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
28e70 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
28e80 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
28e90 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
28ea0 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
28eb0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
28ec0 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
28ed0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28ee0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
28ef0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
28f00 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
28f10 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
28f20 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
28f30 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
28f40 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
28f50 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
28f60 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
28f70 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
28f80 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
28f90 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
28fa0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
28fb0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
28fc0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
28fd0 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
28fe0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
28ff0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
29000 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
29010 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
29020 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
29030 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
29040 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
29050 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
29060 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
29070 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
29080 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
29090 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
290a0 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
290b0 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
290c0 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
290d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
290e0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
290f0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
29100 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
29110 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
29120 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
29130 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
29140 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
29150 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29160 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
29170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29180 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
29190 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
291a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
291b0 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
291c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
291d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
291e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
291f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
29200 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29220 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
29230 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
29240 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
29250 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
29260 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
29270 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
29280 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
29290 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
292a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
292b0 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
292c0 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
292d0 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
292e0 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
292f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
29300 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
29310 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
29320 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
29330 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
29340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
29350 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
29360 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
29370 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
29380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29390 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
293a0 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
293b0 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
293c0 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
293d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
293e0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
293f0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
29400 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
29410 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
29420 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
29430 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
29440 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
29450 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
29460 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
29470 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
29480 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
29490 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
294a0 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
294b0 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
294c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
294d0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
294e0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
294f0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
29500 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
29510 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
29520 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29530 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29540 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
29550 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
29560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29570 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29580 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
29590 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
295a0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
295b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
295c0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
295d0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
295e0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
295f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
29600 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
29610 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
29620 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
29630 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29640 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
29650 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
29660 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
29670 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
29680 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29690 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
296a0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
296b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
296c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
296d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
296e0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
296f0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
29700 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
29710 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
29720 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
29730 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
29740 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
29750 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
29760 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29770 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
29780 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
29790 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
297a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
297b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
297c0 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
297d0 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
297e0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
297f0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
29800 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
29810 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
29820 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
29830 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
29840 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
29850 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29860 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
29870 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29880 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
29890 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
298a0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
298b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
298c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
298d0 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
298e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
298f0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
29900 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
29910 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
29920 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
29930 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
29940 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
29950 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
29960 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
29970 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
29980 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29990 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
299a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
299b0 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
299c0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
299d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
299e0 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
299f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29a00 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
29a10 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
29a20 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
29a30 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
29a40 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
29a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29a60 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
29a70 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
29a80 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
29a90 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
29aa0 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
29ab0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
29ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29ad0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
29ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
29af0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
29b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
29b10 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
29b20 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
29b30 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
29b40 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
29b50 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
29b60 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
29b70 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
29b80 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
29b90 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
29ba0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
29bb0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29bc0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
29bd0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
29be0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
29bf0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
29c00 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
29c10 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
29c20 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
29c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
29c40 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
29c50 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
29c60 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
29c70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29c90 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29ca0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29cb0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29cc0 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
29cd0 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
29ce0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
29cf0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
29d00 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
29d10 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
29d20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
29d30 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
29d40 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
29d50 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
29d60 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
29d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
29d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29d90 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
29da0 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
29db0 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
29dc0 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
29dd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
29de0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
29df0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
29e00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
29e10 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
29e20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29e30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
29e50 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
29e60 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
29e70 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
29e80 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
29e90 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
29ea0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
29eb0 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
29ec0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29ed0 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
29ee0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
29ef0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
29f00 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
29f10 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
29f20 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
29f30 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
29f40 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
29f50 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
29f60 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
29f70 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
29f80 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
29f90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29fa0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
29fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
29fc0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
29fd0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29fe0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
29ff0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a000 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a010 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2a020 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
2a030 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
2a040 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a050 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
2a060 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
2a070 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
2a080 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
2a090 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
2a0a0 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
2a0b0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
2a0c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a0d0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
2a0e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
2a0f0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
2a100 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2a110 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
2a120 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
2a130 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
2a140 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
2a150 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
2a160 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
2a170 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2a180 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
2a190 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2a1a0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2a1b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2a1c0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2a1d0 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2a1e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26  pParse->pWith) &
2a1f0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  & p->pPrior==0 )
2a200 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74  {.    With *pWit
2a210 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  h = findRightmos
2a220 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20  t(p)->pWith;.   
2a230 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
2a240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a250 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
2a260 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ith );.      pPa
2a270 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
2a280 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  th->pOuter;.    
2a290 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
2a2a0 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
2a2b0 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
2a2c0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f  .** The SrcList_
2a2d0 69 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70  item structure p
2a2e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a2f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70  ond argument rep
2a300 72 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62  resents a.** sub
2a310 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2a320 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2a330 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2a340 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
2a350 2a 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  * allocates and 
2a360 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72  populates the Sr
2a370 63 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20  cList_item.pTab 
2a380 6f 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65  object. If succe
2a390 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45  ssful,.** SQLITE
2a3a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a3b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2a3c0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
2a3d0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53  ncountered,.** S
2a3e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2a3f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e  int sqlite3Expan
2a400 64 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20  dSubquery(Parse 
2a410 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
2a420 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2a430 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  rom){.  Select *
2a440 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2a450 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a  elect;.  Table *
2a460 70 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  pTab;..  assert(
2a470 20 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d   pSel );.  pFrom
2a480 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
2a490 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2a4a0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
2a4b0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
2a4c0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2a4d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a4e0 4d 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  MEM;.  pTab->nTa
2a4f0 62 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  bRef = 1;.  if( 
2a500 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pFrom->zAlias ){
2a510 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a520 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2a530 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2a540 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  From->zAlias);. 
2a550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
2a560 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a570 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
2a580 3e 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25  >db, "subquery_%
2a590 75 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29  u", pSel->selId)
2a5a0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
2a5b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
2a5c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
2a5d0 6f 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  or; }.  sqlite3C
2a5e0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
2a5f0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
2a600 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
2a610 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
2a620 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
2a630 3d 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  = -1;.  pTab->nR
2a640 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
2a650 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
2a660 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
2a670 37 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74  76) );.  pTab->t
2a680 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
2a690 68 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75  hemeral;..  retu
2a6a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a6b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a6c0 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
2a6d0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
2a6e0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
2a6f0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2a700 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
2a710 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
2a720 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
2a730 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
2a740 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2a750 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
2a760 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
2a770 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
2a780 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
2a790 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
2a7a0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
2a7b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
2a7c0 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
2a7d0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
2a7e0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
2a7f0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
2a800 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
2a810 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2a820 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
2a830 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
2a840 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
2a850 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
2a860 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
2a870 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
2a880 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
2a890 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
2a8a0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
2a8b0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
2a8c0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
2a8d0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
2a8e0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
2a8f0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
2a900 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a910 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
2a920 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
2a930 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
2a940 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
2a950 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
2a960 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
2a970 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
2a980 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2a990 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
2a9a0 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
2a9b0 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
2a9c0 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
2a9d0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
2a9e0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
2a9f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
2aa00 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
2aa10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
2aa20 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
2aa30 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
2aa40 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
2aa50 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
2aa60 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
2aa70 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
2aa80 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
2aa90 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
2aaa0 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
2aab0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
2aac0 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
2aad0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
2aae0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
2aaf0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
2ab00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
2ab10 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
2ab20 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2ab30 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2ab40 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
2ab50 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
2ab60 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
2ab70 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
2ab80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2ab90 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2aba0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2abb0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2abc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2abd0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
2abe0 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
2abf0 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
2ac00 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65  elFlags;.  u32 e
2ac10 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a  listFlags = 0;..
2ac20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2ac30 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
2ac40 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ac50 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
2ac60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2ac70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2ac80 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
2ac90 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
2aca0 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
2acb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2acc0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
2acd0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2ace0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2acf0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
2ad00 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
2ad10 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20  p->pWith, 0);.. 
2ad20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
2ad30 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
2ad40 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
2ad50 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
2ad60 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
2ad70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2ad80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2ad90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
2ada0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
2adb0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
2adc0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
2add0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
2ade0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
2adf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2ae00 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
2ae10 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2ae20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2ae30 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
2ae40 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
2ae50 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
2ae60 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
2ae70 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
2ae80 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
2ae90 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
2aea0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
2aeb0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2aec0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2aed0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2aee0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2aef0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2af00 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
2af10 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
2af20 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
2af30 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
2af40 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
2af50 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2af60 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2af70 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2af80 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
2af90 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
2afa0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
2afb0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2afc0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
2afd0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
2afe0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2aff0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
2b000 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2b010 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b020 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b030 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b040 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
2b050 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2b060 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b070 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
2b080 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
2b090 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b0a0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2b0b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b0c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b0d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
2b0e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b0f0 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ort;.      if( s
2b100 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2b110 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72  uery(pParse, pFr
2b120 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2b130 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20  _Abort;.#endif. 
2b140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b150 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
2b160 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
2b170 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2b180 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
2b190 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
2b1a0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
2b1b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
2b1c0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2b1d0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
2b1e0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
2b1f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
2b200 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b210 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
2b220 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
2b230 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
2b240 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b250 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2b260 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
2b270 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
2b280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
2b290 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b2a0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b2b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2b2c0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
2b2e0 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
2b2f0 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
2b300 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
2b310 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
2b320 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
2b330 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b340 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2b350 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b360 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
2b370 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
2b380 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b390 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
2b3a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b3b0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b3d0 69 53 61 76 65 20 3d 20 70 50 61 72 73 65 2d 3e  iSave = pParse->
2b3e0 69 46 69 78 44 62 3b 0a 20 20 20 20 20 20 20 20  iFixDb;.        
2b3f0 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i16 nCol;.      
2b400 20 20 70 50 61 72 73 65 2d 3e 69 46 69 78 44 62    pParse->iFixDb
2b410 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 53 63   = 1 + sqlite3Sc
2b420 68 65 6d 61 54 6f 49 6e 64 65 78 32 28 0a 20 20  hemaToIndex2(.  
2b430 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70 54            db, pT
2b440 61 62 2d 3e 70 53 63 68 65 6d 61 2c 20 70 46 72  ab->pSchema, pFr
2b450 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 0a 20 20  om->zDatabase.  
2b460 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2b470 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
2b480 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
2b490 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
2b4a0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2b4b0 2d 3e 69 46 69 78 44 62 20 3d 20 69 53 61 76 65  ->iFixDb = iSave
2b4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2b4d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b4f0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b500 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
2b510 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
2b520 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
2b530 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
2b540 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
2b550 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
2b560 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
2b570 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
2b580 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b590 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
2b5a0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
2b5b0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ect);.        pP
2b5c0 61 72 73 65 2d 3e 69 46 69 78 44 62 20 3d 20 69  arse->iFixDb = i
2b5d0 53 61 76 65 3b 0a 20 20 20 20 20 20 20 20 70 54  Save;.        pT
2b5e0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
2b5f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
2b610 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
2b620 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
2b630 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
2b640 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
2b650 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
2b660 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
2b670 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
2b680 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b690 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2b6a0 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
2b6b0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
2b6c0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2b6d0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
2b6e0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
2b6f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
2b700 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
2b710 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
2b720 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b730 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
2b740 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
2b750 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
2b760 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
2b770 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
2b780 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
2b790 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
2b7a0 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
2b7b0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
2b7c0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
2b7d0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2b7e0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
2b7f0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
2b800 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
2b810 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
2b820 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
2b830 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
2b840 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
2b850 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
2b860 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
2b870 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
2b880 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
2b890 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
2b8a0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
2b8b0 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
2b8c0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
2b8d0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
2b8e0 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
2b8f0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
2b900 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
2b910 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
2b920 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2b930 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
2b940 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
2b950 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
2b960 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
2b970 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
2b980 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
2b990 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
2b9a0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
2b9b0 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
2b9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
2b9d0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2b9e0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
2b9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2ba00 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
2ba10 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
2ba20 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
2ba30 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
2ba40 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
2ba50 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
2ba60 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
2ba70 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
2ba80 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2ba90 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
2baa0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
2bab0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
2bac0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
2bad0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
2bae0 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
2baf0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
2bb00 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
2bb10 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2bb20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
2bb30 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
2bb40 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
2bb50 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2bb60 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
2bb70 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
2bb80 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
2bb90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
2bba0 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
2bbb0 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
2bbc0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
2bbd0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
2bbe0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
2bbf0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
2bc00 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
2bc10 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc30 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
2bc40 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
2bc50 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
2bc60 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
2bc70 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
2bc80 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
2bc90 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
2bca0 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2bcb0 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
2bcc0 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
2bcd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
2bce0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2bcf0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
2bd00 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
2bd10 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
2bd20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
2bd30 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
2bd40 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
2bd50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bd60 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
2bd70 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
2bd80 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2bd90 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
2bda0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bdb0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2bdc0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2bdd0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
2bde0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2bdf0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
2be00 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
2be10 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
2be20 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
2be30 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2be40 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2be50 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
2be60 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
2be70 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
2be80 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
2be90 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
2bea0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
2beb0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
2bec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bed0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
2bee0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
2bef0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
2bf00 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2bf10 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
2bf20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2bf30 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
2bf40 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
2bf50 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
2bf60 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
2bf70 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
2bf80 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
2bf90 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
2bfa0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
2bfb0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
2bfc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bfd0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
2bfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2bff0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c000 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
2c010 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2c020 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
2c030 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
2c040 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
2c050 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
2c060 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2c070 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2c080 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2c090 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
2c0a0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2c0b0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2c0c0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2c0d0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
2c0e0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
2c0f0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
2c100 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
2c110 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2c120 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
2c130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c140 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
2c150 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
2c160 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c170 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
2c180 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
2c190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c1a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2c1b0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
2c1c0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
2c1d0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
2c1e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
2c1f0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
2c200 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
2c210 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2c220 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
2c230 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
2c240 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
2c250 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c260 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c280 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
2c290 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2c2a0 78 32 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  x2(db, pTab->pSc
2c2b0 68 65 6d 61 2c 20 70 46 72 6f 6d 2d 3e 7a 44 61  hema, pFrom->zDa
2c2c0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 20  tabase);.       
2c2d0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2c2e0 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
2c2f0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
2c300 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
2c310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
2c320 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
2c330 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2c340 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2c350 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
2c360 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2c370 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
2c380 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
2c390 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
2c3a0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
2c3b0 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
2c3c0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
2c3d0 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
2c3e0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
2c3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
2c400 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
2c410 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
2c420 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
2c430 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
2c440 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
2c450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2c460 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
2c470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2c480 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
2c490 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
2c4a0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
2c4b0 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
2c4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2c4e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c4f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
2c500 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
2c510 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
2c520 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
2c530 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
2c540 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
2c550 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
2c560 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
2c570 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
2c580 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
2c590 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
2c5a0 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
2c5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c5c0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2c5d0 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
2c5e0 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
2c5f0 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
2c600 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
2c610 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
2c620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c630 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c640 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c650 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
2c660 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
2c670 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
2c680 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
2c690 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2c6a0 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
2c6b0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
2c6c0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
2c6d0 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
2c6e0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
2c6f0 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
2c700 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
2c710 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c720 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
2c730 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
2c740 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
2c750 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
2c760 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2c770 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
2c780 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c7a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c7b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c7c0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2c7d0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
2c7e0 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
2c7f0 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
2c800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c810 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
2c820 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
2c830 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
2c840 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
2c850 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
2c860 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
2c870 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
2c880 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2c890 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2c8a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c8c0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
2c8d0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2c8e0 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
2c8f0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2c900 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
2c910 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2c920 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2c930 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
2c940 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
2c950 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
2c960 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
2c970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2c980 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2c990 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
2c9a0 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
2c9b0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2c9c0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2c9d0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2c9e0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
2c9f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
2ca00 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
2ca20 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
2ca30 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
2ca40 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
2ca50 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2ca60 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2ca70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
2ca80 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cab0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
2cad0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
2cae0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2caf0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
2cb00 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2cb10 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
2cb20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
2cb30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cb50 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2cb60 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
2cb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cb80 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2cb90 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2cba0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2cbb0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2cbc0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
2cbd0 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
2cbe0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
2cbf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2cc00 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
2cc10 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
2cc20 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
2cc30 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
2cc40 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
2cc50 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
2cc60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2cc70 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2cc80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
2cc90 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
2cca0 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
2ccb0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
2ccc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ccd0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
2cce0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
2ccf0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
2cd00 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2cd20 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
2cd30 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2cd40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2cd60 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
2cd70 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
2cd80 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
2cdc0 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
2cdd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2cde0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2cdf0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2ce20 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
2ce30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ce40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ce50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
2ce60 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
2ce70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ce80 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
2ce90 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
2cea0 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
2ceb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2cec0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2ced0 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
2cee0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
2cef0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2cf00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2cf10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2cf20 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
2cf30 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
2cf40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2cf60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2cf70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2cf80 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
2cf90 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
2cfa0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69   }.  if( p->pELi
2cfb0 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  st ){.    if( p-
2cfc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
2cfd0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2cfe0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
2cff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2d000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2d010 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
2d020 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
2d030 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d040 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
2d050 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46  .    if( (elistF
2d060 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75  lags & (EP_HasFu
2d070 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29  nc|EP_Subquery))
2d080 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
2d090 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
2d0a0 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20  omplexResult;.  
2d0b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d0c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d0d0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
2d0e0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
2d0f0 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
2d100 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
2d110 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2d120 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2d130 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
2d140 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
2d150 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
2d160 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
2d170 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
2d180 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
2d190 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
2d1a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2d1b0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
2d1c0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
2d1d0 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
2d1e0 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
2d1f0 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
2d200 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
2d210 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
2d220 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
2d230 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2d240 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
2d250 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
2d260 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
2d270 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d280 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2d290 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
2d2a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d2b0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
2d2c0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
2d2d0 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
2d2e0 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
2d2f0 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
2d300 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
2d310 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
2d320 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
2d330 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
2d340 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
2d350 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2d360 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2d370 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2d380 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d390 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
2d3a0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2d3b0 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
2d3c0 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
2d3d0 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
2d3e0 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
2d3f0 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
2d400 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
2d410 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
2d420 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2d430 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
2d440 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
2d450 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
2d460 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d470 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2d480 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
2d490 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
2d4a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d4b0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
2d4c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d4d0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
2d4e0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
2d4f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2d500 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
2d510 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
2d520 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
2d530 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
2d540 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
2d550 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
2d560 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
2d570 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
2d580 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
2d590 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
2d5a0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
2d5b0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
2d5c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d5d0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
2d5e0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
2d5f0 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
2d600 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
2d610 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
2d620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
2d630 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
2d640 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2d650 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2d660 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
2d670 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2d680 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
2d690 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
2d6a0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
2d6b0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
2d6c0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2d6d0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
2d6e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
2d6f0 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
2d700 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2d710 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
2d720 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2d730 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2d740 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
2d750 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
2d760 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46  rse;.  if( OK_IF
2d770 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61  _ALWAYS_TRUE(pPa
2d780 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
2d790 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ) ){.    w.xSele
2d7a0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
2d7b0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
2d7c0 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
2d7d0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d7e0 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71  ack2 = 0;.    sq
2d7f0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2d800 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
2d810 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
2d820 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
2d830 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
2d840 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
2d850 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
2d860 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2d870 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2d880 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2d890 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2d8a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
2d8b0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
2d8c0 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
2d8d0 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
2d8e0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
2d8f0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
2d900 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
2d910 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2d920 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
2d930 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
2d940 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
2d950 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
2d960 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2d970 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
2d980 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
2d990 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
2d9a0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
2d9b0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
2d9c0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
2d9d0 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
2d9e0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
2d9f0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
2da00 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
2da10 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
2da20 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
2da30 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
2da40 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
2da50 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
2da60 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
2da70 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
2da80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
2da90 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
2daa0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
2dab0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2dac0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
2dad0 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
2dae0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2daf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2db00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
2db10 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
2db20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2db30 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
2db40 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
2db50 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
2db60 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ed );.  if( p->s
2db70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
2db80 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
2db90 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  n;.  p->selFlags
2dba0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
2dbb0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
2dbc0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
2dbd0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2dbe0 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  pSrc;.  for(i=0,
2dbf0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
2dc00 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
2dc10 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
2dc20 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2dc30 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
2dc40 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2dc50 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
2dc60 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2dc70 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2dc80 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  l)!=0 ){.      /
2dc90 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
2dca0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2dcb0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
2dcc0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2dcd0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
2dce0 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ect;.      if( p
2dcf0 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77  Sel ){.        w
2dd00 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
2dd10 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
2dd20 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
2dd30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
2dd40 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
2dd50 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
2dd60 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
2dd70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2dd80 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
2dd90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
2dda0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
2ddb0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2ddc0 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
2ddd0 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
2dde0 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
2ddf0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2de00 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
2de10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2de20 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
2de30 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
2de40 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
2de50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2de60 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
2de70 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
2de80 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2de90 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
2dea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2deb0 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
2dec0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2ded0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
2dee0 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  electWalkNoop;. 
2def0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2df00 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
2df10 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
2df20 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2df30 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
2df40 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
2df50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2df60 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2df70 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2df80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
2df90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2dfa0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
2dfb0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
2dfc0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
2dfd0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
2dfe0 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
2dff0 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
2e000 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
2e010 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
2e020 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
2e030 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
2e040 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
2e050 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
2e060 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
2e070 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
2e080 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
2e090 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2e0a0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
2e0b0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
2e0c0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
2e0d0 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
2e0e0 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
2e0f0 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
2e100 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
2e110 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
2e120 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
2e130 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
2e140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e150 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
2e160 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
2e170 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
2e180 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
2e190 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2e1a0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
2e1b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2e1c0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2e1d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2e1e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2e1f0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2e200 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2e210 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
2e220 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
2e230 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
2e240 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
2e250 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
2e260 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p!=0 || pParse->
2e270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e280 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
2e290 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e2a0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
2e2b0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2e2c0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
2e2d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
2e2e0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
2e2f0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
2e300 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2e310 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
2e320 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2e330 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
2e340 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
2e350 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
2e360 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
2e370 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
2e380 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2e390 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2e3a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
2e3b0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
2e3c0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
2e3d0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
2e3e0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
2e3f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
2e400 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2e410 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
2e420 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
2e430 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
2e440 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
2e450 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
2e460 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
2e470 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
2e480 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
2e490 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
2e4a0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
2e4b0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
2e4c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
2e4d0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
2e4e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2e4f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2e500 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2e510 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2e520 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2e530 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
2e540 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
2e550 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
2e560 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
2e570 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
2e580 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
2e590 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2e5a0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
2e5b0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
2e5c0 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
2e5d0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
2e5e0 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
2e5f0 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
2e600 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
2e610 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
2e620 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
2e630 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
2e640 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
2e650 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
2e660 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
2e670 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2e680 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
2e690 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2e6a0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2e6b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2e6c0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2e6d0 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
2e6e0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2e6f0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
2e700 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2e710 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2e720 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2e730 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2e740 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2e750 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
2e760 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
2e770 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
2e780 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e790 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
2e7a0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
2e7b0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
2e7c0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
2e7d0 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
2e7e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2e7f0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
2e800 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
2e810 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
2e820 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2e830 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
2e840 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e850 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
2e860 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2e870 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
2e880 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
2e890 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2e8a0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
2e8b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e8c0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
2e8d0 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
2e8e0 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
2e8f0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
2e900 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
2e910 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
2e920 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2e930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e940 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2e950 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
2e960 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2e970 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
2e980 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20  st,0,0);.       
2e990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e9a0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2e9b0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
2e9c0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2e9f0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2ea00 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
2ea10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2ea20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
2ea30 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
2ea40 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
2ea50 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2ea60 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
2ea70 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
2ea80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
2ea90 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
2eaa0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
2eab0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2eac0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2ead0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2eae0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2eaf0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2eb00 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
2eb10 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
2eb20 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
2eb30 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
2eb40 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
2eb50 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
2eb60 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
2eb70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2eb80 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2eb90 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2eba0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
2ebb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ebc0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
2ebd0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
2ebe0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
2ebf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ec00 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70  ppendP4(v, pF->p
2ec10 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
2ec20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
2ec30 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
2ec40 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
2ec50 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
2ec60 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
2ec70 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
2ec80 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2ec90 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69  *.** If regAcc i
2eca0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2ecb0 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28  here are no min(
2ecc0 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65  ) or max() aggre
2ecd0 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67  gates.** in pAgg
2ece0 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  Info, then only 
2ecf0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41 67  populate the pAg
2ed00 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2ed10 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  tor accumulator.
2ed20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 20 72  ** registers i r
2ed30 65 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63  egister regAcc c
2ed40 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63  ontains 0. The c
2ed50 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20  aller will take 
2ed60 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69  care.** of setti
2ed70 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20  ng and clearing 
2ed80 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69  regAcc..*/.stati
2ed90 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2eda0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2edb0 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41  pParse, int regA
2edc0 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  cc, AggInfo *pAg
2edd0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2ede0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2edf0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
2ee00 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
2ee10 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
2ee20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
2ee30 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2ee40 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ee50 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
2ee60 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2ee70 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
2ee80 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2ee90 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2eea0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2eeb0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
2eec0 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
2eed0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
2eee0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
2eef0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2ef00 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2ef10 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2ef20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ef30 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2ef40 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2ef50 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2ef60 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
2ef70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
2ef80 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
2ef90 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2efa0 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
2efb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2efc0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2efd0 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30  pList, regAgg, 0
2efe0 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
2eff0 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  P);.    }else{. 
2f000 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
2f010 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b       regAgg = 0;
2f020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f030 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
2f040 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
2f050 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
2f060 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2f070 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2f080 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f  g==0 );  /* Erro
2f090 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20  r condition */. 
2f0a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2f0b0 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c  Arg>1 );   /* Al
2f0c0 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  so an error */. 
2f0d0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
2f0e0 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
2f0f0 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
2f100 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
2f110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2f120 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
2f130 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2f140 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
2f150 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2f160 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
2f170 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2f180 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
2f190 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
2f1a0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
2f1b0 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
2f1c0 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
2f1d0 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
2f1e0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
2f1f0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
2f200 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
2f210 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2f220 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2f230 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2f240 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
2f250 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2f260 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2f270 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2f280 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
2f290 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
2f2a0 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
2f2b0 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
2f2c0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
2f2d0 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
2f2e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2f2f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2f300 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
2f310 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
2f320 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
2f330 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
2f340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f350 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp3(v, OP_AggSt
2f360 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
2f370 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71  F->iMem);.    sq
2f380 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2f390 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2f3a0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
2f3b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f3c0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
2f3d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
2f3e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2f3f0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2f400 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
2f410 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
2f420 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f430 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
2f440 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
2f450 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
2f460 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
2f470 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20  cumulator ){.   
2f480 20 72 65 67 48 69 74 20 3d 20 72 65 67 41 63 63   regHit = regAcc
2f490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48  ;.  }.  if( regH
2f4a0 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
2f4b0 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
2f4c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2f4d0 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
2f4e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2f4f0 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  }.  for(i=0, pC=
2f500 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2f510 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2f520 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2f530 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2f540 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2f550 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2f560 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2f570 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2f580 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 64  de = 0;.  if( ad
2f590 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2f5a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2f5b0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2f5c0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2f5d0 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2f5e0 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2f5f0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2f600 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2f610 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2f620 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2f630 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2f640 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2f650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2f660 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2f670 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2f680 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2f690 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2f6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f6b0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2f6c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f6e0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2f6f0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2f700 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2f710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f720 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2f730 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2f740 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2f750 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2f760 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2f770 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2f780 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2f790 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2f7a0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2f7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f7c0 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20  Explain(pParse, 
2f7d0 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  0, "SCAN TABLE %
2f7e0 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2f7f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2f800 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2f810 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2f820 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2f830 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2f840 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2f850 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2f860 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2f870 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2f880 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2f890 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
2f8a0 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
2f8b0 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68  ed by havingToWh
2f8c0 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ere()..**.** If 
2f8d0 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20  the node passed 
2f8e0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2f8f0 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65  is a TK_AND node
2f900 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43  , return .** WRC
2f910 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c  _Continue to tel
2f920 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  l sqlite3WalkExp
2f930 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74  r() to iterate t
2f940 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64  hrough child nod
2f950 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
2f960 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f  ise, return WRC_
2f970 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63  Prune. In this c
2f980 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20  ase, also check 
2f990 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65  if the .** sub-e
2f9a0 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
2f9b0 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66  s the criteria f
2f9c0 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  or being moved t
2f9d0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  o the WHERE.** c
2f9e0 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64  lause. If so, ad
2f9f0 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52  d it to the WHER
2fa00 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70  E clause and rep
2fa10 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70  lace the sub-exp
2fa20 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69  ression.** withi
2fa30 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  n the HAVING exp
2fa40 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63  ression with a c
2fa50 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a  onstant "1"..*/.
2fa60 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e  static int havin
2fa70 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57  gToWhereExprCb(W
2fa80 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2fa90 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2faa0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2fab0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c  K_AND ){.    Sel
2fac0 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65  ect *pS = pWalke
2fad0 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
2fae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2faf0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
2fb00 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50  upBy(pWalker->pP
2fb10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d  arse, pExpr, pS-
2fb20 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20  >pGroupBy) ){.  
2fb30 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
2fb40 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2fb50 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70  e->db;.      Exp
2fb60 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
2fb70 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
2fb80 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
2fb90 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
2fba0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2fbb0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45  New ){.        E
2fbc0 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53  xpr *pWhere = pS
2fbd0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
2fbe0 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e    SWAP(Expr, *pN
2fbf0 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20  ew, *pExpr);.   
2fc00 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2fc10 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
2fc20 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
2fc30 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65        pS->pWhere
2fc40 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
2fc50 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2fc60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2fc70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
2fc80 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
2fc90 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2fca0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
2fcb0 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
2fcc0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
2fcd0 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
2fce0 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
2fcf0 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
2fd00 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
2fd10 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2fd20 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
2fd30 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
2fd40 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
2fd50 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
2fd60 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2fd70 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2fd80 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
2fd90 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
2fda0 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
2fdb0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2fdc0 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
2fdd0 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2fde0 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
2fdf0 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
2fe00 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
2fe10 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
2fe20 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2fe30 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
2fe40 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
2fe50 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
2fe60 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
2fe70 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
2fe80 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
2fe90 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
2fea0 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
2feb0 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
2fec0 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
2fed0 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
2fee0 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a  gToWhere(Parse *
2fef0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2ff00 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  p){.  Walker sWa
2ff10 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lker;.  memset(&
2ff20 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
2ff30 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
2ff40 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
2ff50 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
2ff60 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2ff70 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
2ff80 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
2ff90 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  r.u.pSelect = p;
2ffa0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2ffb0 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e  pr(&sWalker, p->
2ffc0 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45  pHaving);.#if SE
2ffd0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2ffe0 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e  D.  if( sWalker.
2fff0 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65  eCode && (sqlite
30000 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
30010 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
30020 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
30030 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76  0,pParse,p,("Mov
30040 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69  e HAVING terms i
30050 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b  nto WHERE:\n"));
30060 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30070 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
30080 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
30090 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
300a0 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68  o see if the pTh
300b0 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62  is entry of pTab
300c0 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a  List is a self-j
300d0 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76  oin of a prior v
300e0 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  iew..** If it is
300f0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
30100 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66  e SrcList_item f
30110 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65  or the prior vie
30120 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  w.  If it is not
30130 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
30140 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74   0..*/.static st
30150 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
30160 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65  m *isSelfJoinVie
30170 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  w(.  SrcList *pT
30180 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
30190 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
301a0 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68  self-joins in th
301b0 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  is FROM clause *
301c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
301d0 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20  st_item *pThis  
301e0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
301f0 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74  rior reference t
30200 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  o this subquery 
30210 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
30220 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
30230 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20  em;.  for(pItem 
30240 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  = pTabList->a; p
30250 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65  Item<pThis; pIte
30260 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
30270 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  tem->pSelect==0 
30280 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30290 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
302a0 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e  aCoroutine ) con
302b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
302c0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
302d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
302e0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
302f0 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  mp(pItem->zDatab
30300 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74  ase, pThis->zDat
30310 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74  abase)!=0 ) cont
30320 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
30330 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
30340 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69  tem->zName, pThi
30350 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  s->zName)!=0 ) c
30360 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30370 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
30380 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20  are(0, .        
30390 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74    pThis->pSelect
303a0 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
303b0 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
303c0 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20  , -1) .    ){.  
303d0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20      /* The view 
303e0 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  was modified by 
303f0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  some other optim
30400 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a  ization such as.
30410 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77        ** pushDow
30420 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f  nWhereTerms() */
30430 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
30440 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
30450 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72  n pItem;.  }.  r
30460 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
30470 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
30480 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
30490 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ON./*.** Attempt
304a0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
304b0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
304c0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  m.**.**    SELEC
304d0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
304e0 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
304f0 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
30500 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  CT y FROM t2).**
30510 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a  .** Into this:.*
30520 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28  *.**    SELECT (
30530 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
30540 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54  FROM t1)+(SELECT
30550 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
30560 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61  2).**.** The tra
30570 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79  nsformation only
30580 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66   works if all of
30590 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
305a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
305b0 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
305c0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
305d0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  of two or more t
305e0 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  erms.**   *  The
305f0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
30600 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
30610 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20 54  clause.**   *  T
30620 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45  here is no WHERE
30630 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
30640 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f  HAVING clauses o
30650 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
30660 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74  .**   *  The out
30670 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69  er query is a si
30680 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a  mple count(*).**
30690 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
306a0 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
306b0 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65  ion is undertake
306c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
306d0 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
306e0 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  mization(Parse *
306f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
30700 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  p){.  Select *pS
30710 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45  ub, *pPrior;.  E
30720 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
30730 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71  pr *pCount;.  sq
30740 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
30750 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
30760 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
30770 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f   ) return 0;   /
30780 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67  * This is an agg
30790 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
307a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
307b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307d0 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   Single result c
307e0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72  olumn */.  pExpr
307f0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
30800 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
30810 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
30820 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
30830 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
30840 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67   Result is an ag
30850 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
30860 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
30870 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
30880 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75  ,"count") ) retu
30890 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75  rn 0;  /* Is cou
308a0 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45  nt() */.  if( pE
308b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  xpr->x.pList!=0 
308c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
308d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
308e0 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20  ust be count(*) 
308f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  */.  if( p->pSrc
30900 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
30910 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30920 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61         /* One ta
30930 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a  ble in FROM  */.
30940 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
30950 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
30960 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
30970 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30990 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
309a0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  is a subquery */
309b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
309c0 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
309d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
309e0 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
309f0 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f  a compound ry */
30a00 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
30a10 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  Sub->op!=TK_ALL 
30a20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
30a30 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
30a40 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c  Must be UNION AL
30a50 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  L */.    if( pSu
30a60 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  b->pWhere ) retu
30a70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
30a90 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
30aa0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
30ab0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
30ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30ad0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
30ae0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  IT clause */.   
30af0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
30b00 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
30b10 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
30b20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67     /* Not an agg
30b30 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53  regate */.    pS
30b40 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  ub = pSub->pPrio
30b50 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b70 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63  /* Repeat over c
30b80 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68  ompound */.  }wh
30b90 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20  ile( pSub );..  
30ba0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
30bb0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69  his point then i
30bc0 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f  t is OK to perfo
30bd0 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  rm the transform
30be0 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ation */..  db =
30bf0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
30c00 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20  Count = pExpr;. 
30c10 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53   pExpr = 0;.  pS
30c20 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
30c30 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d  0].pSelect;.  p-
30c40 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30c50 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
30c60 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
30c70 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
30c80 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
30c90 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
30ca0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
30cb0 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77  (*p->pSrc));.  w
30cc0 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20  hile( pSub ){.  
30cd0 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20    Expr *pTerm;. 
30ce0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62     pPrior = pSub
30cf0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53  ->pPrior;.    pS
30d00 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ub->pPrior = 0;.
30d10 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20      pSub->pNext 
30d20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73  = 0;.    pSub->s
30d30 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
30d40 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75  gregate;.    pSu
30d50 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  b->selFlags &= ~
30d60 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20  SF_Compound;.   
30d70 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
30d80 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  w = 0;.    sqlit
30d90 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
30da0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
30db0 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  t);.    pTerm = 
30dc0 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33  pPrior ? sqlite3
30dd0 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75  ExprDup(db, pCou
30de0 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b  nt, 0) : pCount;
30df0 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73  .    pSub->pELis
30e00 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
30e10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
30e20 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , 0, pTerm);.   
30e30 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
30e40 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
30e50 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
30e60 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
30e70 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
30e80 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a  , pTerm, pSub);.
30e90 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
30ea0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20   ){.      pExpr 
30eb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c  = pTerm;.    }el
30ec0 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20  se{.      pExpr 
30ed0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
30ee0 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20  Parse, TK_PLUS, 
30ef0 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20  pTerm, pExpr);. 
30f00 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20     }.    pSub = 
30f10 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d  pPrior;.  }.  p-
30f20 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
30f30 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  xpr = pExpr;.  p
30f40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
30f50 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69  F_Aggregate;..#i
30f60 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
30f70 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
30f80 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
30f90 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
30fa0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
30fb0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
30fc0 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f   count-of-view o
30fd0 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29  ptimization:\n")
30fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
30ff0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31000 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
31010 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  f.  return 1;.}.
31020 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31030 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
31040 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
31050 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
31060 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
31070 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
31080 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
31090 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
310a0 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
310b0 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
310c0 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
310d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
310e0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
310f0 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
31100 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
31110 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
31120 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
31130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
31140 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
31150 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
31160 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
31170 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
31180 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
31190 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
311a0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
311b0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
311c0 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
311d0 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
311e0 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
311f0 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
31200 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
31210 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
31220 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
31230 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
31240 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
31250 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
31260 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
31270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
31280 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
31290 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
312a0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
312b0 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
312c0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
312d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
312e0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
312f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
31300 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
31310 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
31320 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
31330 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
31340 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
31350 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
31360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
31370 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
31380 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
31390 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
313a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
313b0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
313c0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
313d0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
313e0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
313f0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
31400 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
31410 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
31420 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
31430 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
31440 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
31450 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
31460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31470 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
31480 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
31490 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
314a0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
314b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
314c0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
314d0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
314e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
314f0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
31500 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
31510 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
31520 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
31530 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
31540 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
31550 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
31560 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
31570 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
31580 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
31590 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
315a0 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
315b0 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
315c0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
315d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
315e0 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
315f0 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
31600 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
31610 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
31620 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31640 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
31650 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
31660 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
31670 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
31680 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
31690 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
316a0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72  rList *pMinMaxOr
316b0 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41  derBy = 0;  /* A
316c0 64 64 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f  dded ORDER BY fo
316d0 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
316e0 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78  s */.  u8 minMax
316f0 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Flag;           
31700 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f        /* Flag fo
31710 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
31720 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61  s */..  db = pPa
31730 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
31740 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
31750 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  arse);.  if( p==
31760 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
31770 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
31780 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
31790 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
317a0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
317b0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
317c0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
317d0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
317e0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
317f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
31800 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
31810 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31820 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
31830 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
31840 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
31850 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78  , pParse->addrEx
31860 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20 73  plain));.  if( s
31870 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
31880 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
31890 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
318a0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
318b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
318c0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
318d0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
318e0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
318f0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
31900 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
31910 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
31920 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
31930 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31940 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31950 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
31960 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
31970 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31980 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31990 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
319a0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
319b0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
319c0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
319d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
319e0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
319f0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
31a00 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
31a10 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31a20 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
31a30 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
31a40 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
31a50 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31a60 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
31a70 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31a80 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
31a90 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
31aa0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
31ab0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
31ac0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
31ad0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
31ae0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
31af0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
31b00 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
31b10 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
31b20 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
31b30 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
31b40 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
31b50 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
31b60 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
31b70 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
31b80 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
31b90 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
31ba0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
31bb0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
31bc0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66  rse, p, 0);.  if
31bd0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
31be0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
31bf0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
31c00 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
31c10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
31c20 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c  st!=0 );.#if SEL
31c30 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
31c40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
31c50 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
31c60 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  4 ){.    SELECTT
31c70 52 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73  RACE(0x104,pPars
31c80 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
31c90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
31ca0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
31cb0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
31cc0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
31cd0 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d  if..  if( pDest-
31ce0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
31cf0 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
31d00 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
31d10 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 23  arse, p);.  }..#
31d20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31d30 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
31d40 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  if( sqlite3Windo
31d50 77 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c  wRewrite(pParse,
31d60 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   p) ){.    goto 
31d70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
31d80 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31d90 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
31da0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31db0 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20 20   & 0x108 ){.    
31dc0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
31dd0 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  4,pParse,p, ("af
31de0 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69  ter window rewri
31df0 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  te:\n"));.    sq
31e00 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
31e10 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
31e20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  }.#endif.#endif 
31e30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
31e40 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 70  INDOWFUNC */.  p
31e50 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
31e60 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  c;.  isAgg = (p-
31e70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
31e80 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
31e90 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
31ea0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
31eb0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
31ec0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
31ed0 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  ;..  /* Try to v
31ee0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
31ef0 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
31f00 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
31f10 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
31f20 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
31f30 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
31f40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
31f50 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
31f60 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
31f70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
31f80 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
31f90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
31fa0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
31fb0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
31fc0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
31fd0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
31fe0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
31ff0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
32000 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
32010 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
32020 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
32030 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
32040 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
32050 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
32060 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
32070 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
32080 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
32090 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
320a0 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
320b0 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
320c0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
320d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
320e0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
320f0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
32100 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
32110 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
32120 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
32130 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
32140 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
32150 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
32160 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
32170 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
32180 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32190 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
321a0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
321b0 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
321c0 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
321d0 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
321e0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
321f0 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
32200 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
32210 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
32220 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
32230 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
32240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
32250 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
32260 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
32270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
32280 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
32290 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
322a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
322b0 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
322c0 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
322d0 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
322e0 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
322f0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
32300 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
32310 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
32320 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
32330 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
32340 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
32350 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
32360 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
32370 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
32380 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
32390 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
323b0 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
323c0 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
323d0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
323e0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
323f0 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
32400 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
32410 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
32420 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
32430 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
32440 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
32450 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
32460 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
32470 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
32480 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
32490 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
324a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
324b0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
324c0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
324d0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
324e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
324f0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
32500 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
32510 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
32520 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
32530 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
32540 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
32550 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
32560 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
32570 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
32580 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
32590 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
325a0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
325b0 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
325c0 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
325d0 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
325e0 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
325f0 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
32600 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
32610 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
32620 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
32630 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
32640 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
32650 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
32660 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
32670 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
32680 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
32690 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
326a0 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
326b0 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
326c0 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
326d0 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
326e0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
326f0 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
32700 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
32710 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
32720 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
32730 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
32740 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
32750 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
32760 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
32770 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
32780 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
32790 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
327a0 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
327b0 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
327c0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
327d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
327e0 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
327f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
32800 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
32810 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
32820 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
32830 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
32840 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
32850 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
32860 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
32870 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
32880 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
32890 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
328a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
328b0 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
328c0 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
328d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
328e0 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
328f0 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
32900 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
32910 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
32920 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
32930 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
32940 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
32950 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
32960 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
32970 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
32980 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
32990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
329a0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
329b0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
329c0 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
329d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
329e0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
329f0 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
32a00 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
32a10 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
32a20 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
32a30 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
32a40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32a50 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
32a60 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
32a70 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
32a80 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
32a90 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
32aa0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
32ab0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
32ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32ad0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
32ae0 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
32af0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
32b00 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
32b10 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
32b20 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
32b30 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
32b40 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
32b50 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
32b60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
32b70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45  , pDest);.#if SE
32b80 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
32b90 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
32ba0 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28  E(0x1,pParse,p,(
32bb0 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  "end compound-se
32bc0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c  lect processing\
32bd0 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73  n"));.    if( (s
32be0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32bf0 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20 26  e & 0x2000)!=0 &
32c00 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  & ExplainQueryPl
32c10 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29  anParent(pParse)
32c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
32c30 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
32c40 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
32c50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
32c60 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20  ( p->pNext==0 ) 
32c70 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
32c80 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
32c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
32ca0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20  #endif..  /* Do 
32cb0 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65  the WHERE-clause
32cc0 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
32cd0 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ation optimizati
32ce0 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a 20 20  on if this is.  
32cf0 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e  ** a join.  No n
32d00 65 65 64 20 74 6f 20 73 70 65 65 64 20 74 69 6d  eed to speed tim
32d10 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72 61 74  e on this operat
32d20 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e  ion for non-join
32d30 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 61 73   queries.  ** as
32d40 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
32d50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c  optimization wil
32d60 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  l be handled by 
32d70 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69 6e  query planner in
32d80 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  .  ** sqlite3Whe
32d90 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a  reBegin()..  */.
32da0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
32db0 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f 70 74  nSrc>1.   && Opt
32dc0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
32dd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f 70  (db, SQLITE_Prop
32de0 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20 20 26  agateConst).   &
32df0 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  & propagateConst
32e00 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 29 0a  ants(pParse, p).
32e10 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
32e20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32e30 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
32e40 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
32e50 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
32e60 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
32e70 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 6e 73  e,p,("After cons
32e80 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
32e90 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
32ea0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32eb0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
32ed0 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52  se{.    SELECTTR
32ee0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
32ef0 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70 72  ,p,("Constant pr
32f00 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68 65  opagation not he
32f10 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a  lpful\n"));.  }.
32f20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
32f30 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
32f40 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70  IZATION.  if( Op
32f50 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
32f60 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
32f70 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49  ryFlattener|SQLI
32f80 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a  TE_CountOfView).
32f90 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65     && countOfVie
32fa0 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50  wOptimization(pP
32fb0 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20  arse, p).  ){.  
32fc0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
32fd0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
32fe0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45  lect_end;.    pE
32ff0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
33000 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
33010 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65   p->pSrc;.  }.#e
33020 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  ndif..  /* For e
33030 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
33040 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20  FROM clause, do 
33050 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a  two things:.  **
33060 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20   (1) Authorized 
33070 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  unreferenced tab
33080 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e  les.  ** (2) Gen
33090 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
330a0 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20  ll sub-queries. 
330b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
330c0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
330d0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
330e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
330f0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
33100 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
33110 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
33120 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a    Select *pSub;.
33130 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
33140 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
33150 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
33160 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
33170 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33180 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
33190 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  xt;.#endif..    
331a0 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f  /* Issue SQLITE_
331b0 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
331c0 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20  ons with a fake 
331d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20  column name for 
331e0 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  any.    ** table
331f0 73 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72  s that are refer
33200 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77  enced but from w
33210 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61  hich no values a
33220 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20  re extracted..  
33230 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66    ** Examples of
33240 20 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e   where these kin
33250 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54  ds of null SQLIT
33260 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
33270 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75  tions.    ** wou
33280 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a  ld occur:.    **
33290 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
332a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
332b0 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t1;   -- SQLITE
332c0 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20  _READ t1."".    
332d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31  **     SELECT t1
332e0 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20  .* FROM t1, t2; 
332f0 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
33300 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20   t2."".    **.  
33310 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f    ** The fake co
33320 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20  lumn name is an 
33330 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
33340 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
33350 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20  r a table to.   
33360 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d   ** have a colum
33370 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65  n named by the e
33380 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20  mpty string, in 
33390 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65  which case there
333a0 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20   is no way to.  
333b0 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68    ** distinguish
333c0 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65   between an unre
333d0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61  ferenced table a
333e0 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66  nd an actual ref
333f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20  erence to the.  
33400 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20    ** "" column. 
33410 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
33420 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20  ign was for the 
33430 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
33440 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20   to be a NULL,. 
33450 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c     ** which woul
33460 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73  d be unambiguous
33470 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75  .  But legacy au
33480 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
33490 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20  backs might.    
334a0 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f  ** assume the co
334b0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e  lumn name is non
334c0 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75  -NULL and segfau
334d0 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  lt.  The use of 
334e0 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20  an empty.    ** 
334f0 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66  string for the f
33500 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
33510 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20  seems safer..   
33520 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
33530 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b  m->colUsed==0 ){
33540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
33550 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
33560 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74  SQLITE_READ, pIt
33570 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70  em->zName, "", p
33580 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
33590 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
335a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
335b0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
335c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
335d0 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a  MIT_VIEW).    /*
335e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
335f0 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
33600 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
33610 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20  lause.    */.   
33620 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pSub = pItem->p
33630 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
33640 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
33650 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  ue;..    /* Some
33660 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66  times the code f
33670 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69  or a subquery wi
33680 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
33690 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  more than.    **
336a0 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75   once, if the su
336b0 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f  bquery is part o
336c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
336d0 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49  se in a LEFT JOI
336e0 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78  N,.    ** for ex
336f0 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  ample.  In that 
33700 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67  case, do not reg
33710 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
33720 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20   to manifest.   
33730 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68   ** a view or th
33740 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  e co-routine to 
33750 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77  implement a view
33760 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73  .  The first ins
33770 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20  tance.    ** is 
33780 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75  sufficient, thou
33790 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  gh the subroutin
337a0 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68  e to manifest th
337b0 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64  e view does need
337c0 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
337d0 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  voked again. */.
337e0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
337f0 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
33800 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
33810 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  g.viaCoroutine==
33820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
33830 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  The subroutine t
33840 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68  hat manifests th
33850 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20  e view might be 
33860 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69  a one-time routi
33870 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ne,.        ** o
33880 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20  r it might need 
33890 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65  to be rerun on e
338a0 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65  ach iteration be
338b0 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20  cause it.       
338c0 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f   ** encodes a co
338d0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
338e0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65  y. */.        te
338f0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56  stcase( sqlite3V
33900 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65  dbeGetOp(v, pIte
33910 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d  m->addrFillSub)-
33920 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65  >opcode==OP_Once
33930 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
33940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33950 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
33960 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
33970 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
33980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
339a0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
339b0 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
339c0 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
339d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
339e0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
339f0 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
33a00 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
33a10 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
33a20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
33a30 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
33a40 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
33a50 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
33a60 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
33a70 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
33a80 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
33a90 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
33aa0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
33ab0 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
33ac0 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
33ad0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
33ae0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
33af0 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
33b00 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
33b10 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
33b20 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
33b30 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
33b40 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
33b50 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
33b60 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
33b70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
33b80 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
33b90 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
33ba0 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
33bb0 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
33bc0 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
33bd0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
33be0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
33bf0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
33c00 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20  E_PushDown).    
33c10 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72   && pushDownWher
33c20 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
33c30 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  Sub, p->pWhere, 
33c40 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a  pItem->iCursor,.
33c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c60 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65             (pIte
33c70 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
33c80 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20   JT_OUTER)!=0). 
33c90 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
33ca0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
33cb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
33cc0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
33cd0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
33ce0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
33cf0 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
33d00 20 20 20 20 20 20 28 22 41 66 74 65 72 20 57 48        ("After WH
33d10 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
33d20 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71 75 65  down into subque
33d30 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75 62 2d  ry %d:\n", pSub-
33d40 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20  >selId));.      
33d50 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
33d60 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
33d70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33d90 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33da0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50  100,pParse,p,("P
33db0 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73  ush-down not pos
33dc0 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20  sible\n"));.    
33dd0 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74  }..    zSavedAut
33de0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
33df0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
33e00 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
33e10 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
33e20 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f  m->zName;..    /
33e30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
33e40 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
33e50 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
33e60 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71  .    ** The subq
33e70 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e  uery is implemen
33e80 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
33e90 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75  ine if the subqu
33ea0 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75  ery is.    ** gu
33eb0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
33ec0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
33ed0 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
33ee0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
33ef0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f    ** computed mo
33f00 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
33f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
33f20 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
33f30 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
33f40 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
33f50 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
33f60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
33f70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
33f80 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
33f90 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
33fa0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
33fb0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
33fc0 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
33fd0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
33fe0 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
33ff0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
34000 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
34010 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
34020 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
34030 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
34040 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
34050 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
34060 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34070 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
34080 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
34090 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
340a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
340b0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
340c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
340d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
340e0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
340f0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
34100 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
34110 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
34120 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
34130 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34140 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
34150 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
34160 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
34170 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
34180 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
34190 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
341a0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
341b0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
341c0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
341d0 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20   1, "CO-ROUTINE 
341e0 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64  %u", pSub->selId
341f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34200 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
34210 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
34220 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
34230 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
34240 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
34250 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
34260 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
34270 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
34280 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
34290 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
342a0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
342b0 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
342c0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
342d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
342e0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
342f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
34300 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
34310 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
34320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
34330 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
34340 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
34350 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
34360 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
34370 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
34380 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
34390 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
343a0 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
343b0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
343c0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
343d0 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
343e0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
343f0 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
34400 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
34410 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
34420 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
34430 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
34440 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34450 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
34460 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
34470 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
34480 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74  etAddr;.      st
34490 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
344a0 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20  m *pPrior;..    
344b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
344c0 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20  >addrFillSub==0 
344d0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
344e0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
344f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
34500 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69    topAddr = sqli
34510 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34520 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
34530 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34540 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
34550 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f  addrFillSub = to
34560 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69  pAddr+1;.      i
34570 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  f( pItem->fg.isC
34580 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
34590 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
345a0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
345b0 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
345c0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
345d0 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
345e0 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
345f0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
34600 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
34610 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
34620 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
34630 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
34640 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
34650 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
34660 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
34670 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
34680 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34690 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
346a0 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
346b0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
346c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
346d0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
346e0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
346f0 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
34700 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
34710 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
34720 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53      pPrior = isS
34730 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62  elfJoinView(pTab
34740 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20  List, pItem);.  
34750 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
34760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34780 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d  P_OpenDup, pItem
34790 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f  ->iCursor, pPrio
347a0 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  r->iCursor);.   
347b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
347c0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ior->pSelect!=0 
347d0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  );.        pSub-
347e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
347f0 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e  rior->pSelect->n
34800 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
34810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34820 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
34830 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
34840 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
34850 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
34860 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
34870 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
34880 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 25 75   "MATERIALIZE %u
34890 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29  ", pSub->selId))
348a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
348b0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
348c0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
348d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
348e0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
348f0 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
34900 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
34910 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c  ( onceAddr ) sql
34920 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34930 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20  (v, onceAddr);. 
34940 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73       retAddr = s
34950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34960 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
34970 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
34980 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34990 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22  ent((v, "end %s"
349a0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
349b0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
349c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
349d0 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65  1(v, topAddr, re
349e0 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71  tAddr);.      sq
349f0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
34a00 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
34a10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
34a20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
34a30 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
34a40 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  ;.    pParse->nH
34a50 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
34a60 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
34a70 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  (p);.    pParse-
34a80 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
34a90 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
34aa0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  t;.#endif.  }.. 
34ab0 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d   /* Various elem
34ac0 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ents of the SELE
34ad0 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c  CT copied into l
34ae0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66  ocal variables f
34af0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65  or.  ** convenie
34b00 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  nce */.  pEList 
34b10 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  = p->pEList;.  p
34b20 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
34b30 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  e;.  pGroupBy = 
34b40 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
34b50 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
34b60 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74  ing;.  sDistinct
34b70 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65  .isTnct = (p->se
34b80 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
34b90 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53  inct)!=0;..#if S
34ba0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
34bb0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
34bc0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
34bd0 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  400 ){.    SELEC
34be0 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
34bf0 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c  rse,p,("After al
34c00 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e  l FROM-clause an
34c10 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20  alysis:\n"));.  
34c20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
34c30 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
34c40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34c50 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
34c60 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
34c70 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
34c80 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
34c90 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
34ca0 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
34cb0 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
34cc0 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
34cd0 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
34ce0 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
34cf0 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
34d00 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
34d10 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
34d20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
34d30 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
34d40 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
34d50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
34d60 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
34d70 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
34d80 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
34d90 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
34da0 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a  xyz ORDER BY xyz
34db0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
34dc0 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
34dd0 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
34de0 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
34df0 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
34e00 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
34e10 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
34e20 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
34e30 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
34e40 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
34e50 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
34e60 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
34e70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
34e80 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
34e90 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
34ea0 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
34eb0 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
34ec0 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
34ed0 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
34ee0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
34ef0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
34f00 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
34f10 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
34f20 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
34f30 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
34f40 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
34f50 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
34f60 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
34f70 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
34f80 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42  nct;.    pGroupB
34f90 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  y = p->pGroupBy 
34fa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
34fb0 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
34fc0 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69   0);.    /* Noti
34fd0 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
34fe0 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
34ff0 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
35000 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
35010 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
35020 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
35030 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
35040 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
35050 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
35060 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
35070 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
35080 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
35090 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
350a0 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
350b0 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
350c0 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c  Tnct );..#if SEL
350d0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
350e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
350f0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
35100 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c  400 ){.      SEL
35110 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
35120 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66  Parse,p,("Transf
35130 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74  orm DISTINCT int
35140 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29  o GROUP BY:\n"))
35150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
35160 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
35170 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
35180 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ndif.  }..  /* I
35190 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
351a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
351b0 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70  hen create an ep
351c0 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
351d0 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72  .  ** do the sor
351e0 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20  ting.  But this 
351f0 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61  sorting ephemera
35200 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  l index might en
35210 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20  d up.  ** being 
35220 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
35230 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ta can be extrac
35240 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
35250 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66  d order..  ** If
35260 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
35270 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f  e, then the OP_O
35280 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
35290 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
352a0 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  .  ** changed to
352b0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
352c0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
352d0 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
352e0 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f  index is.  ** no
352f0 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73  t needed.  The s
35300 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35310 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ex variable is u
35320 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
35330 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e  e.  ** that chan
35340 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
35350 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
35360 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
35370 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
35380 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
35390 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
353a0 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  t(.        pPars
353b0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
353c0 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
353d0 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
353e0 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
353f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
35400 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35410 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
35420 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
35430 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35440 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
35450 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
35460 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
35470 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
35480 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
35490 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
354a0 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
354b0 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
354c0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
354d0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
354e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
354f0 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
35500 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
35510 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
35520 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
35530 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
35540 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
35550 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
35570 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
35580 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
35590 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
355a0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
355b0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
355c0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
355d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
355e0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
355f0 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
35600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  )==0 ){.    p->n
35610 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
35620 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
35630 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d  ows */.  }.  com
35640 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
35650 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
35660 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
35670 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
35680 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
35690 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
356a0 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
356b0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
356c0 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
356d0 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
356e0 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
356f0 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
35700 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
35710 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
35720 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
35730 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
35740 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
35750 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
35760 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
35770 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
35780 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
35790 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
357a0 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
357b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
357c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
357d0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
357e0 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
357f0 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
35800 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
35810 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35820 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46  )sqlite3KeyInfoF
35830 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
35840 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
35850 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
35860 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
35870 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
35880 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
35890 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
358a0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
358b0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
358c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
358d0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
358e0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
358f0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
35900 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
35910 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
35920 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
35930 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
35940 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
35950 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
35960 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
35970 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
35980 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
35990 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
359a0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 0a 20  _DISTINCT : 0). 
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73    | (p->selFlags
359d0 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
359e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
359f0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
35a00 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  C.    Window *pW
35a10 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20  in = p->pWin;   
35a20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e     /* Master win
35a30 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e  dow object (or N
35a40 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66 28 20  ULL) */.    if( 
35a50 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  pWin ){.      sq
35a60 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49  lite3WindowCodeI
35a70 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e  nit(pParse, pWin
35a80 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
35a90 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52      assert( WHER
35aa0 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f  E_USE_LIMIT==SF_
35ab0 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a  FixedLimit );...
35ac0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
35ad0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
35ae0 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  */.    SELECTTRA
35af0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
35b00 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b  WhereBegin\n"));
35b10 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
35b20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35b30 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
35b40 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
35b50 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
35b80 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
35b90 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  p->nSelectRow);.
35ba0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
35bb0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
35bc0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
35bd0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
35be0 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
35bf0 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
35c00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
35c10 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
35c20 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
35c30 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
35c40 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
35c50 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
35c60 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
35c70 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
35c80 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
35c90 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
35ca0 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
35cb0 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
35cc0 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
35cd0 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
35ce0 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
35cf0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
35d00 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
35d10 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62  .      sSort.lab
35d20 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71 6c 69 74  elOBLopt = sqlit
35d30 65 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69  e3WhereOrderByLi
35d40 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70 57 49 6e  mitOptLabel(pWIn
35d50 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fo);.      if( s
35d60 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f  Sort.nOBSat==sSo
35d70 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
35d80 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53  pr ){.        sS
35d90 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
35da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35db0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
35dc0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
35dd0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
35de0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
35df0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
35e00 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
35e10 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
35e20 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
35e30 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
35e40 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
35e50 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
35e60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f    */.    if( sSo
35e70 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35e80 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72  >=0 && sSort.pOr
35e90 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
35ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35eb0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
35ec0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35ed0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
35ee0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d  sert( p->pEList=
35ef0 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66 6e 64  =pEList );.#ifnd
35f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
35f10 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 69 66  INDOWFUNC.    if
35f20 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( pWin ){.      
35f30 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20 3d 20  int addrGosub = 
35f40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
35f50 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
35f60 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74  nt iCont = sqlit
35f70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
35f80 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 42  v);.      int iB
35f90 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
35fa0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
35fb0 20 20 20 20 20 20 69 6e 74 20 72 65 67 47 6f 73        int regGos
35fc0 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ub = ++pParse->n
35fd0 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Mem;..      sqli
35fe0 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
35ff0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  p(pParse, p, pWI
36000 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  nfo, regGosub, a
36010 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20 20 20  ddrGosub);..    
36020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36030 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
36040 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
36050 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36060 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
36070 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56  rGosub);.      V
36080 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
36090 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73  v, "inner-loop s
360a0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
360b0 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f      sSort.labelO
360c0 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  BLopt = 0;.     
360d0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
360e0 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
360f0 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e  &sSort, &sDistin
36100 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e 74  ct, pDest, iCont
36110 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
36120 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
36130 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
36140 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
36150 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36160 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f 73  P_Return, regGos
36170 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ub);.      VdbeC
36180 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
36190 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f  inner-loop subro
361a0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20  utine"));.      
361b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
361c0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
361d0 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  k);.    }else.#e
361e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
361f0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
36200 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a  /.    {.      /*
36210 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
36220 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f  d inner loop. */
36230 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
36240 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
36250 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
36260 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
36270 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
36280 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
36290 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
362a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
362b0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
362c0 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20  WInfo));..      
362d0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
362e0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
362f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
36300 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
36310 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
36320 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
36330 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
36340 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
36350 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
36360 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
36370 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
36380 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
36390 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
363a0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
363b0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
363c0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
363d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
363e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
363f0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
36400 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
36410 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
36420 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
36430 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
36440 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
36450 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
36460 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
36470 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
36480 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
36490 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
364a0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
364b0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
364c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
364d0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
364e0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
364f0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
36520 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
36530 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
36540 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
36550 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
36560 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
36570 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
36580 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
36590 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
365a0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
365b0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
365c0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
365d0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
365e0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
365f0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
36600 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
36610 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
36620 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
36630 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
36640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
36650 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
36660 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
36670 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
36680 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
36690 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
366a0 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
366b0 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
366c0 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
366d0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
366e0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
366f0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
36700 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
36710 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
36720 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
36730 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
36740 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
36770 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
36780 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
36790 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
367a0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
367b0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
367c0 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
367d0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
367e0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
367f0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
36800 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
36810 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
36820 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
36830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
36840 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
36850 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
36860 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
36870 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
36880 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
36890 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
368a0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
368b0 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
368c0 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
368d0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
368e0 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
368f0 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
36900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
36910 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
36920 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
36930 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
36940 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
36950 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
36960 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
36970 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
36980 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
36990 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
369a0 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
369b0 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
369c0 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
369d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
369e0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
369f0 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
36a00 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
36a10 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
36a20 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
36a30 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
36a40 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
36a50 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
36a60 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
36a70 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
36a80 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
36a90 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
36aa0 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
36ab0 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
36ac0 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
36ad0 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
36ae0 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
36af0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
36b00 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
36b10 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
36b20 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
36b30 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
36b40 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
36b50 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
36b60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
36b70 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
36b80 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
36b90 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
36ba0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
36bb0 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
36bc0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
36bd0 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
36be0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
36bf0 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
36c00 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
36c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
36c20 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
36c30 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
36c40 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
36c50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
36c60 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
36c70 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
36c80 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
36c90 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
36ca0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
36cb0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
36cc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
36cd0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
36ce0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
36cf0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
36d00 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
36d10 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
36d20 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
36d30 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e    sNC.uNC.pAggIn
36d40 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
36d50 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e      VVA_ONLY( sN
36d60 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55  C.ncFlags = NC_U
36d70 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73  AggInfo; ).    s
36d80 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
36d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
36da0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
36db0 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
36dc0 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
36dd0 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
36de0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
36df0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
36e00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
36e10 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
36e20 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
36e30 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
36e40 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
36e50 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
36e60 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
36e70 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
36e80 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
36e90 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72     assert( pWher
36ea0 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a  e==p->pWhere );.
36eb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36ec0 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76  pHaving==p->pHav
36ed0 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ing );.        a
36ee0 73 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d  ssert( pGroupBy=
36ef0 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  =p->pGroupBy );.
36f00 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f          havingTo
36f10 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29  Where(pParse, p)
36f20 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65  ;.        pWhere
36f30 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
36f40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
36f50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
36f60 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
36f70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
36f80 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
36f90 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
36fa0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
36fb0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
36fc0 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e  ==0 && p->pHavin
36fd0 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f  g==0 && sAggInfo
36fe0 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  .nFunc==1 ){.   
36ff0 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
37000 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20  minMaxQuery(db, 
37010 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
37020 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61  ].pExpr, &pMinMa
37030 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  xOrderBy);.    }
37040 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d  else{.      minM
37050 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  axFlag = WHERE_O
37060 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
37070 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
37080 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
37090 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
370a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
370b0 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
370c0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
370d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
370e0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
370f0 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
37100 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
37110 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
37120 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
37130 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
37140 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
37150 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
37160 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
37170 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
37180 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
37190 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
371a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
371b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
371c0 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45  ct_end;.#if SELE
371d0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
371e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
371f0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
37200 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  00 ){.      int 
37210 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ii;.      SELECT
37220 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
37230 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67  se,p,("After agg
37240 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a  regate analysis:
37250 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  \n"));.      sql
37260 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
37270 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
37280 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
37290 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
372a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
372b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
372c0 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b  ntf("agg-column[
372d0 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a  %d] iMem=%d\n",.
372e0 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20              ii, 
372f0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
37300 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
37310 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
37320 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f  Expr(0, sAggInfo
37330 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c  .aCol[ii].pExpr,
37340 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37350 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
37360 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
37370 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
37380 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
37390 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a  f("agg-func[%d]:
373a0 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
373b0 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
373c0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e  gInfo.aFunc[ii].
373d0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
373e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
373f0 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
37400 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20  Func[ii].pExpr, 
37410 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
37420 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f  }.#endif...    /
37430 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
37440 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
37450 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
37460 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
37470 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
37480 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
37490 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
374a0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
374b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
374c0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
374d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
374e0 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
374f0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
37500 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
37510 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37520 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
37530 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
37540 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
37550 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
37560 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
37570 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
37580 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
37590 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
375a0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
375b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
375c0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
375d0 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
375e0 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
375f0 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
37600 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
37610 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
37620 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
37630 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
37640 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
37650 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
37660 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
37670 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
37680 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
37690 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
376a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
376b0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
376c0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
376d0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
376e0 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
376f0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
37700 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* 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 72 65 73 65 74 20 73 75  ter for reset su
37730 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
37740 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
37750 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
37760 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
37770 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
37780 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
37790 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
377a0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
377b0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
377c0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
377d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
377e0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
377f0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
37800 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
37810 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
37820 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
37830 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
37840 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
37850 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
37860 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
37870 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
37880 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
37890 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
378a0 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70  st(pParse,pGroup
378b0 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43  By,0,sAggInfo.nC
378c0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64  olumn);.      ad
378d0 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
378e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
378f0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
37900 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  n, .          sA
37910 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
37920 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
37930 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
37940 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
37950 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
37960 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f  YINFO);..      /
37970 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
37980 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
37990 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
379a0 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
379b0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
379c0 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
379d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
379e0 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
379f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37a00 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
37a10 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
37a20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
37a30 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
37a40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
37a50 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
37a60 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
37a70 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
37a80 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
37a90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
37aa0 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
37ab0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
37ac0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
37ad0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
37ae0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
37af0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
37b00 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
37b10 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
37b20 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
37b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37b40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
37b50 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
37b60 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
37b70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
37b80 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
37b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37ba0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
37bb0 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
37bc0 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
37bd0 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
37be0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
37bf0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
37c00 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
37c10 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
37c20 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
37c30 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
37c40 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
37c50 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
37c60 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
37c70 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
37c80 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
37c90 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
37ca0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
37cb0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
37cc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
37cd0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
37ce0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
37cf0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
37d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37d10 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
37d20 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
37d30 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
37d40 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
37d50 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
37d60 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
37d70 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
37d80 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
37d90 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
37da0 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
37db0 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
37dc0 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
37dd0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
37de0 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
37df0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
37e00 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
37e10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
37e20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
37e30 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
37e40 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
37e50 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
37e60 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
37e70 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
37e80 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
37e90 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
37ea0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
37eb0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
37ec0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
37ed0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
37ee0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
37ef0 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
37f00 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
37f10 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
37f20 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
37f30 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
37f40 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
37f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37f60 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
37f70 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
37f80 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
37f90 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
37fa0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
37fb0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
37fc0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
37fd0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
37fe0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
37ff0 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
38000 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
38010 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
38020 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
38030 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
38040 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
38050 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
38060 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
38070 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
38080 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
38090 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
380a0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
380b0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
380c0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
380d0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
380e0 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
380f0 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
38100 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
38110 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
38120 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
38130 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
38140 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
38150 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
38160 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
38170 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
38180 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
38190 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
381a0 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
381b0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
381c0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
381d0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
381e0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
381f0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
38200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
38210 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
38220 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
38230 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
38240 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
38250 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
38260 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
38270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
38280 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
38290 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
382a0 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20  By, regBase, 0, 
382b0 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
382c0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
382d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
382e0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
382f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
38300 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
38310 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
38320 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
38330 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
38340 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
38350 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
38360 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
38370 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
38380 20 20 20 73 71 6c 69 74 65