/ Hex Artifact Content
Login

Artifact 67a3082237f11a1d9dd6cbb914212423e60c2f8e49b063a05063b483cf78d586:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 70 50 61 72 73 65 2c 20 2a 70 70 57 68 65 72  (pParse, *ppWher
2da0: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2db0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2dc0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2dd0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2de0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2df0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2e00: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2e10: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
2e20: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
2e30: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
2e40: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
2e50: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2e60: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2e70: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2e80: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2e90: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2ea0: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2eb0: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2ec0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2ee0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2ef0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2f00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2f10: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2f20: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2f30: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2f40: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2f50: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2f60: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2f70: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2f80: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2f90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2fa0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2fb0: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2fc0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2fd0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2fe0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2ff0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
3000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
3010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
3020: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3030: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
3040: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
3050: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
3060: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
3070: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
3080: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
3090: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
30a0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
30b0: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
30c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
30d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
30f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
3100: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
3110: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
3120: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
3130: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
3140: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
3150: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
3160: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
3170: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
3180: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
3190: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
31a0: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
31b0: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
31c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
31d0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
31e0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
31f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
3200: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
3210: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
3220: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
3230: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
3240: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
3250: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
3260: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
3280: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
3290: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
32a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
32b0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
32c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
32e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
32f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
3300: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
3310: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
3320: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
3330: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
3340: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
3350: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
3360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3370: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
3430: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
3440: 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f   Undo the work o
3450: 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e  f setJoinExpr().
3460: 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73    In the express
3470: 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76  ion tree p, conv
3480: 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72  ert every.** ter
3490: 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64  m that is marked
34a0: 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
34b0: 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e  n and iRightJoin
34c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e  Table==iTable in
34d0: 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
34e0: 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74  y term that omit
34f0: 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  s the EP_FromJoi
3500: 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  n mark..**.** Th
3510: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
3520: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73  a LEFT JOIN is s
3530: 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61  implified into a
3540: 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
3550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3560: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  unsetJoinExpr(Ex
3570: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
3580: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
3590: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
35a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
35b0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
35c0: 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70  & (iTable<0 || p
35d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
35e0: 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20  e==iTable) ){.  
35f0: 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
3600: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
3610: 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Join);.    }.   
3620: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3630: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3640: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3650: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3660: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3680: 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69          unsetJoi
3690: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
36a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
36b0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
36c0: 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f     }.    unsetJo
36d0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
36e0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
36f0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
3700: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3710: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3720: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3730: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3750: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3760: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3770: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3780: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3790: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
37a0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
37b0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
37c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
37d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
37e0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
37f0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
3800: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3810: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3820: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3830: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3840: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3850: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3860: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3870: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3880: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3890: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
38a0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
38b0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
38c0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
38d0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
38e0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
38f0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
3900: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3910: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3920: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3930: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3940: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3950: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3960: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3980: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3990: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
39a0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
39b0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
39c0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
39d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
39e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3a20: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3a30: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3a50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3a60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3a70: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3a80: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3a90: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3ab0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
3ac0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
3ad0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
3ae0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
3af0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
3b00: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3b10: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3b30: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3b40: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  {.    Table *pRi
3b60: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
3b70: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
3b80: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
3b90: 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54   NEVER(pLeft->pT
3ba0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
3bb0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
3bc0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
3bd0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
3be0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3bf0: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3c00: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3c10: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3c20: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3c30: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3c40: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3c50: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3c60: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3c70: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3c80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
3ca0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
3cb0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
3cc0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
3cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3cf0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3d00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3d20: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3d30: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3d40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3d60: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3d70: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d90: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
3da0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
3db0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3dd0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
3de0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3e00: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3e10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3e20: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3e30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3e40: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3e60: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3e70: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e80: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3e90: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
3ea0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
3eb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3ec0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ed0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3f00: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3f10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3f20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3f30: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3f40: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3f50: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3f60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3f70: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3f80: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3fb0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
3fc0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
3fd0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
3fe0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3ff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
4000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4010: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
4020: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
4030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4040: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
4050: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
4060: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
4070: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
4080: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
4090: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
40a0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
40b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
40c0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
40d0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
40e0: 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  rAnd(pParse, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 46 61 73 74 52 61 6e 64 6f 6d 6e 65 73 73  e3FastRandomness
11ac0 28 26 64 62 2d 3e 73 50 72 6e 67 2c 20 73 69 7a  (&db->sPrng, siz
11ad0 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b  eof(cnt), &cnt);
11ae0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
11af0 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
11b00 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
11b10 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
11b20 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20  ame(0, pCol);.  
11b30 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73    if( zName && s
11b40 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
11b50 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f  (&ht, zName, pCo
11b60 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20  l)==pCol ){.    
11b70 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
11b80 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
11b90 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
11ba0 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20  ear(&ht);.  if( 
11bb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11bc0 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
11bd0 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
11be0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11bf0 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
11c00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
11c10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11c20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
11c30 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
11c40 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
11c50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
11c60 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
11c70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11c80 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
11c90 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
11ca0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
11cb0 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
11cc0 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
11cd0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
11ce0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
11cf0 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
11d00 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
11d10 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
11d20 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
11d30 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
11d40 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
11d50 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
11d60 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
11d70 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
11d80 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
11d90 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
11da0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
11db0 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
11dc0 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
11dd0 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
11de0 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
11df0 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
11e00 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
11e10 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
11e20 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
11e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11e40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11e50 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
11e60 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
11e70 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
11e80 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
11e90 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
11ea0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
11eb0 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
11ec0 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
11ed0 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
11ee0 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
11ef0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11f00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
11f10 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
11f20 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
11f30 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
11f40 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
11f50 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
11f60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
11f70 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  a;..  assert( pS
11f80 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
11f90 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
11fa0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
11fb0 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
11fc0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
11fd0 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
11fe0 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
11ff0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12000 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
12010 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
12020 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
12030 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
12040 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
12050 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
12060 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
12070 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
12080 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
12090 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
120a0 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
120b0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
120c0 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
120d0 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
120e0 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
120f0 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
12100 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
12110 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70   0, 0);.    /* p
12120 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e  Col->szEst = ...
12130 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20   // Column size 
12140 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20 74  est for SELECT t
12150 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65 64  ables never used
12160 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66   */.    pCol->af
12170 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
12180 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
12190 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29  .    if( zType )
121a0 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c 69  {.      m = sqli
121b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
121c0 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  e);.      n = sq
121d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
121e0 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
121f0 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
12200 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
12210 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  OrFree(db, pCol-
12220 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a  >zName, n+m+2);.
12230 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
12240 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
12250 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a   memcpy(&pCol->z
12260 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65  Name[n+1], zType
12270 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , m+1);.        
12280 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
12290 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
122a0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
122b0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
122c0 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
122d0 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
122e0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
122f0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12300 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
12310 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
12320 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
12330 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
12340 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
12350 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
12360 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
12370 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
12380 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
12390 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a   1; /* Any non-z
123a0 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73 20  ero value works 
123b0 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  */.}../*.** Give
123c0 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
123d0 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
123e0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
123f0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
12400 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
12410 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
12420 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
12430 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
12440 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
12450 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
12460 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
12470 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
12480 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12490 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61 67  .  u64 savedFlag
124a0 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
124b0 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
124c0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75  db->flags &= ~(u
124d0 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  64)SQLITE_FullCo
124e0 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
124f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
12500 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
12510 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
12520 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12530 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , 0);.  db->flag
12540 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
12550 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12560 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
12570 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
12580 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
12590 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
125a0 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ior;.  pTab = sq
125b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
125c0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
125d0 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
125e0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
125f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
12600 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
12610 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
12620 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
12630 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
12640 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
12650 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
12660 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
12670 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
12680 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
12690 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
126a0 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
126b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
126c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
126d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
126e0 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
126f0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
12700 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
12710 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
12720 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
12730 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
12740 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12750 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12760 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
12770 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
12780 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
12790 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
127a0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
127b0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
127c0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
127d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
127e0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
127f0 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
12800 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
12810 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
12820 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
12830 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
12840 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12850 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
12860 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
12870 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
12880 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
12890 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
128a0 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
128b0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
128c0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
128d0 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28  pVdbe;.  }.  if(
128e0 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
128f0 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
12900 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
12910 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
12920 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
12930 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
12940 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
12950 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
12960 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72  rn sqlite3VdbeCr
12970 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a  eate(pParse);.}.
12980 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
12990 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
129a0 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
129b0 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
129c0 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
129d0 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  it expressions. 
129e0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
129f0 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12a00 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
12a10 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
12a20 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
12a30 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
12a40 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
12a50 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
12a60 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
12a70 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
12a80 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
12a90 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
12aa0 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
12ab0 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
12ac0 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
12ad0 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
12ae0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
12af0 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
12b00 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
12b10 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
12b20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
12b30 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
12b40 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
12b50 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
12b60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
12b70 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
12b80 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
12b90 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
12ba0 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
12bb0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
12bc0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
12bd0 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12be0 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64  .  iLimit.** and
12bf0 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
12c00 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
12c10 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
12c20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
12c30 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
12c40 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
12c50 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
12c60 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
12c70 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
12c80 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
12c90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
12ca0 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
12cb0 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
12cc0 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
12cd0 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
12ce0 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
12cf0 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
12d00 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
12d10 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
12d20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  if pLimit->pLeft
12d30 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
12d40 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
12d50 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
12d60 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
12d70 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
12d80 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
12d90 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
12da0 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
12db0 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
12dc0 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
12dd0 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
12de0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
12df0 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
12e00 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12e10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
12e20 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
12e30 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
12e40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
12e50 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
12e60 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
12e70 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
12e80 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69   p->pLimit;..  i
12e90 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
12ea0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
12eb0 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
12ec0 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
12ed0 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
12ee0 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
12ef0 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
12f00 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
12f10 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
12f20 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
12f30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12f40 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
12f50 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
12f60 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
12f70 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
12f80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12f90 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
12fa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12fb0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
12fc0 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
12fd0 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
12fe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12ff0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13000 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13010 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13020 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13030 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
13040 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
13050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13070 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
13080 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
13090 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
130a0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
130b0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
130c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
130d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
130e0 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
130f0 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
13100 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
13110 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
13130 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
13140 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13150 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
13160 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
13170 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
13180 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
13190 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
131a0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
131b0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
131c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
131d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
131e0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
131f0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13200 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13210 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
13220 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
13230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
13250 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
13260 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
13270 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
13280 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
13290 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
132a0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
132b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
132c0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
132d0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
132e0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
132f0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
13300 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
13310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13320 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
13330 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
13340 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
13350 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13360 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
13370 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
13380 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
13390 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
133a0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
133b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
133c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
133d0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
133e0 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
133f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
13400 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13410 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
13420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13440 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
13450 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
13460 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
13470 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13480 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
13490 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
134a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
134b0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
134c0 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
134d0 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
134e0 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
134f0 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
13500 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
13510 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
13520 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13530 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
13540 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
13550 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
13560 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
13570 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
13580 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
13590 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
135a0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
135b0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
135c0 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
135d0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
135e0 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
135f0 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
13600 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
13610 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
13620 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13630 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
13640 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
13650 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
13660 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
13670 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
13680 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
13690 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
136a0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
136b0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
136c0 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
136d0 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
136e0 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
136f0 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
13700 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
13710 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
13720 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
13730 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
13740 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
13750 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
13760 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13770 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
13780 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
13790 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
137a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
137b0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
137c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
137d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
137e0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
137f0 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
13800 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
13810 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13820 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13830 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
13840 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
13850 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
13860 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
13870 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
13880 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
13890 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
138a0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
138b0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
138c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
138d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
138e0 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
138f0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
13900 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
13910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
13920 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
13930 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
13940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13950 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
13960 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
13970 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
13980 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
13990 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
139a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
139b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
139c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
139d0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
139e0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
139f0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
13a00 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
13a10 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
13a20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13a30 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13a40 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
13a50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13a60 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
13a70 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
13a80 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
13a90 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
13aa0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
13ab0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
13ac0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
13ad0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
13ae0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13af0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13b00 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
13b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13b20 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13b30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13b40 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
13b50 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
13b60 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13b70 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
13b80 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
13b90 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
13ba0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
13bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13bc0 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
13bd0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
13be0 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
13bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13c00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
13c10 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
13c20 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
13c30 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
13c40 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
13c50 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
13c60 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
13c70 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
13c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13c90 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
13ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13cb0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
13cc0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
13cd0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
13ce0 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
13cf0 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
13d00 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
13d10 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13d20 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
13d30 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
13d40 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
13d50 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
13d60 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
13d90 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
13da0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13dd0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
13de0 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
13df0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
13e00 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
13e10 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
13e20 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
13e30 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
13e40 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
13e50 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
13e60 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
13e70 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13e80 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
13e90 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
13ea0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
13eb0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
13ec0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
13ed0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
13ee0 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
13ef0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13f00 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13f10 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
13f20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
13f30 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
13f40 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
13f50 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
13f60 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
13f70 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
13f80 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
13f90 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
13fa0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
13fb0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
13fc0 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
13fd0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
13fe0 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
13ff0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
14000 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
14010 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14020 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
14030 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
14040 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
14050 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
14060 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
14070 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
14080 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
14090 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
140a0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
140b0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
140c0 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
140d0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
140e0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
140f0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
14100 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
14110 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
14120 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
14130 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
14140 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
14150 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
14160 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
14170 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
14180 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
14190 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
141a0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
141b0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
141c0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
141d0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
141e0 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
141f0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14200 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
14210 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
14220 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
14230 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
14240 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
14250 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
14260 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
14270 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
14280 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
14290 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
142a0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
142b0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
142c0 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
142d0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
142e0 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
142f0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
14300 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
14310 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
14320 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
14330 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
14340 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
14350 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
14360 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
14370 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
14380 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
14390 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
143a0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
143b0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
143c0 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
143d0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
143e0 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
143f0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
14400 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
14410 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
14420 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
14430 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
14440 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
14450 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
14460 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
14470 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
14480 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
14490 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
144a0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
144b0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
144c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
144d0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
144e0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
144f0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
14500 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14510 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
14520 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14530 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
14540 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14550 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
14560 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
14570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
14580 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
14590 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
145a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
145b0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
145c0 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
145d0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
145e0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
145f0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
14600 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
14610 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
14620 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
14630 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14640 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
14650 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
14660 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
14670 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
14680 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
14690 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
146a0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
146b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
146c0 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
146d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
146e0 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
146f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14700 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
14710 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14720 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
14730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14740 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14750 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
14760 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14770 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
14780 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
14790 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
147a0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
147b0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
147c0 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
147d0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
147e0 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
147f0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
14800 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
14810 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14820 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14850 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
14880 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
14890 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
148a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
148b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
148c0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
148f0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
14900 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
14910 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
14920 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
14930 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
14940 45 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ET */..#ifndef S
14950 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
14960 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70  WFUNC.  if( p->p
14970 57 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Win ){.    sqlit
14980 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14990 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 77  e, "cannot use w
149a0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
149b0 69 6e 20 72 65 63 75 72 73 69 76 65 20 71 75 65  in recursive que
149c0 72 69 65 73 22 29 3b 0a 20 20 20 20 72 65 74 75  ries");.    retu
149d0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
149e0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68    /* Obtain auth
149f0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20  orization to do 
14a00 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  a recursive quer
14a10 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  y */.  if( sqlit
14a20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14a30 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52  se, SQLITE_RECUR
14a40 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29  SIVE, 0, 0, 0) )
14a50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50   return;..  /* P
14a60 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54  rocess the LIMIT
14a70 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
14a80 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69  ses, if they exi
14a90 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61  st */.  addrBrea
14aa0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
14ab0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
14ac0 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
14ad0 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
14ae0 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
14af0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
14b00 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
14b10 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
14b20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
14b30 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  it;.  regLimit =
14b40 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
14b50 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
14b60 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
14b70 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
14b80 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
14b90 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
14ba0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
14bb0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
14bc0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
14bd0 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
14be0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
14bf0 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
14c00 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
14c10 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
14c20 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
14c30 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74  {.      iCurrent
14c40 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43   = pSrc->a[i].iC
14c50 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65  ursor;.      bre
14c60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
14c70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
14c80 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  sors numbers for
14c90 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69   Queue and Disti
14ca0 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nct.  The cursor
14cb0 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a   number for.  **
14cc0 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61   the Distinct ta
14cd0 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63  ble must be exac
14ce0 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20  tly one greater 
14cf0 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72  than Queue in or
14d00 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  der.  ** for the
14d10 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e   SRT_DistFifo an
14d20 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  d SRT_DistQueue 
14d30 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20  destinations to 
14d40 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75  work. */.  iQueu
14d50 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
14d60 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ++;.  if( p->op=
14d70 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
14d80 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14d90 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75  y ? SRT_DistQueu
14da0 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f  e : SRT_DistFifo
14db0 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20  ;.    iDistinct 
14dc0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
14de0 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
14df0 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52  ? SRT_Queue : SR
14e00 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71  T_Fifo;.  }.  sq
14e10 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14e20 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
14e30 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
14e40 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14e50 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
14e60 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
14e70 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
14e80 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
14e90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
14ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14eb0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
14ec0 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
14ed0 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
14ee0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
14ef0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14f00 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
14f10 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
14f20 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
14f30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
14f50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
14f60 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
14f70 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
14fa0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
14fb0 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
14fc0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
14fd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
14fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ff0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15000 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
15010 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
15020 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
15030 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
15040 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
15050 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
15060 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
15070 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15080 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
15090 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
150a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
150b0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
150c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
150d0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
150e0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
150f0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
15100 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
15110 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
15120 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
15130 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
15140 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
15150 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
15160 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  0;.  ExplainQuer
15170 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
15180 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20 72  , "SETUP"));.  r
15190 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
151a0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
151b0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
151c0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
151d0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
151e0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
151f0 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
15200 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
15210 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
15220 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
15230 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
15240 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
15250 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15260 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
15270 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
15280 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
15290 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
152a0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
152b0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
152c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
152d0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
152e0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
152f0 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
15300 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
15310 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
15320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15330 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
15340 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
15350 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
15360 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
15370 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15390 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
153a0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
153b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
153c0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
153d0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
153e0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
153f0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
15400 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
15410 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15420 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
15430 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
15440 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43  regOffset, addrC
15450 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e  ont);.  selectIn
15460 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
15470 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  p, iCurrent,.   
15480 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
15490 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
154a0 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
154b0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
154c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
154d0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
154e0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
154f0 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
15500 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
15510 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
15520 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
15530 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
15540 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
15550 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
15560 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
15570 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
15580 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
15590 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
155a0 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
155b0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
155c0 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
155d0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
155e0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
155f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15600 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
15610 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
15620 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
15630 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
15640 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
15650 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61  r = 0;.    Expla
15660 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15670 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49  rse, 1, "RECURSI
15680 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20  VE STEP"));.    
15690 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
156a0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
156b0 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eue);.    assert
156c0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
156d0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
156e0 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20  = pSetup;.  }.. 
156f0 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
15700 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
15710 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
15720 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
15730 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
15740 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  op);.  sqlite3Vd
15750 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15760 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65  , addrBreak);..e
15770 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
15780 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33  query:.  sqlite3
15790 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
157a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
157b0 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f  rderBy);.  p->pO
157c0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
157d0 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  y;.  p->pLimit =
157e0 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72   pLimit;.  retur
157f0 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
15800 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
15810 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
15820 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74  ferences */.stat
15830 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15840 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
15850 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15860 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15870 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15880 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15890 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
158a0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
158b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
158c0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
158d0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
158e0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
158f0 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  sults */.);../*.
15900 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70  ** Handle the sp
15910 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
15920 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
15930 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
15940 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53  from a.** VALUES
15950 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e   clause.  By han
15960 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  dling this as a 
15970 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65  special case, we
15980 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72   avoid deep.** r
15990 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68  ecursion, and th
159a0 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  us do not need t
159b0 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51  o enforce the SQ
159c0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
159d0 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e  UND_SELECT.** on
159e0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
159f0 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20  ..**.** Because 
15a00 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
15a10 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
15a20 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  m a VALUES claus
15a30 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72  e:.**   (1) Ther
15a40 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72  e is no LIMIT or
15a50 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20   OFFSET or else 
15a60 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54  there is a LIMIT
15a70 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a   of exactly 1.**
15a80 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73     (2) All terms
15a90 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a   are UNION ALL.*
15aa0 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73  *   (3) There is
15ab0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
15ac0 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c  use.**.** The "L
15ad0 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20  IMIT of exactly 
15ae0 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69  1" case of condi
15af0 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61  tion (1) comes a
15b00 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55  bout when a VALU
15b10 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63  ES.** clause occ
15b20 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61  urs within scala
15b30 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78  r expression (ex
15b40 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45  : "SELECT (VALUE
15b50 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e  S(1),(2),(3))").
15b60 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43  .** The sqlite3C
15b70 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c  odeSubselect wil
15b80 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68 65  l have added the
15b90 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20   LIMIT 1 clause 
15ba0 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20  in tht case..** 
15bb0 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20  Since the limit 
15bc0 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65  is exactly 1, we
15bd0 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76   only need to ev
15be0 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d  alutes the left-
15bf0 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a  most VALUES..*/.
15c00 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
15c10 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20  SelectValues(.  
15c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15c30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15c40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15c50 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15c60 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
15c70 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
15c80 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
15c90 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
15ca0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
15cb0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
15cc0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
15cd0 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20   int nRow = 1;. 
15ce0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
15cf0 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d  nt bShowAll = p-
15d00 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73  >pLimit==0;.  as
15d10 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
15d20 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
15d30 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61  e );.  do{.    a
15d40 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15d50 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
15d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d70 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28  >op==TK_ALL || (
15d80 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
15d90 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   && p->pPrior==0
15da0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
15db0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20   p->pNext==0 || 
15dc0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
15dd0 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69  ==p->pNext->pELi
15de0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
15df0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
15e00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  0 ) break;.    a
15e10 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15e20 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20  ->pNext==p );.  
15e30 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b    p = p->pPrior;
15e40 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68  .    nRow += bSh
15e50 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28  owAll;.  }while(
15e60 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  1);.  ExplainQue
15e70 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15e80 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53  0, "SCAN %d CONS
15e90 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f  TANT ROW%s", nRo
15ea0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
15eb0 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f         nRow==1 ?
15ec0 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77   "" : "S"));.  w
15ed0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73  hile( p ){.    s
15ee0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
15ef0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
15f00 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29   0, pDest, 1, 1)
15f10 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f 77  ;.    if( !bShow
15f20 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  All ) break;.   
15f30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15f40 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
15f50 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
15f60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15f70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15f80 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
15f90 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
15fa0 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
15fb0 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
15fc0 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
15fd0 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
15fe0 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
15ff0 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
16000 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
16010 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
16020 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
16030 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
16040 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
16050 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
16060 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
16070 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
16080 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
16090 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
160a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
160b0 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
160c0 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
160d0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
160e0 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
160f0 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
16100 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
16110 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
16120 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
16130 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
16140 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
16150 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
16160 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
16170 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
16180 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
16190 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
161a0 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
161b0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
161c0 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
161d0 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
161e0 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
161f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
16200 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
16210 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
16220 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
16230 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
16240 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
16260 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
16270 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
16280 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
16290 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
162a0 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
162b0 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
162c0 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
162d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
162e0 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
162f0 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
16300 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
16310 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
16320 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
16330 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
16340 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
16350 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
16360 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
16370 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
16380 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
16390 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
163a0 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
163b0 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
163c0 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
163d0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
163e0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
163f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
16400 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16410 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
16420 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16430 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
16440 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
16450 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
16460 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
16470 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
16480 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
16490 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
164a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
164b0 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
164c0 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
164d0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
164e0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
164f0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
16500 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
16510 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
16520 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
16530 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16540 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
16550 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
16560 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
16570 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
16580 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
16590 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
165a0 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
165b0 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
165c0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
165d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
165e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
165f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16600 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16610 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
16620 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
16630 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
16640 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
16650 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
16660 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
16670 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
16680 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
16690 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
166a0 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
166b0 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
166c0 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
166d0 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
166e0 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65  s much */.  asse
166f0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
16700 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
16710 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ==0 || p->op==TK
16720 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  _ALL || p->op==T
16730 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20  K_UNION );.  db 
16740 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16750 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
16760 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44  or;.  dest = *pD
16770 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  est;.  if( pPrio
16780 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70  r->pOrderBy || p
16790 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
167a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
167b0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20  rMsg(pParse,"%s 
167c0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
167d0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
167e0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70  before",.      p
167f0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21  Prior->pOrderBy!
16800 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20  =0 ? "ORDER BY" 
16810 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63  : "LIMIT", selec
16820 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16830 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
16840 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16850 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
16860 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16870 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
16880 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
16890 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
168a0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
168b0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
168c0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
168d0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
168e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
168f0 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
16900 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
16910 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
16920 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
16930 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
16940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16950 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
16960 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
16970 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
16980 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e  Expr);.    dest.
16990 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
169a0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  e;.  }..  /* Spe
169b0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f  cial handling fo
169c0 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  r a compound-sel
169d0 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
169e0 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20  tes as a VALUES 
169f0 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
16a00 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16a10 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
16a20 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
16a30 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61  SelectValues(pPa
16a40 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
16a50 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16a60 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
16a70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
16a80 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
16a90 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
16aa0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16ab0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
16ac0 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
16ad0 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
16ae0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
16af0 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
16b00 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
16b10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16b20 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  ==pPrior->pEList
16b30 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e  ->nExpr );..#ifn
16b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16b50 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  CTE.  if( p->sel
16b60 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
16b70 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65  sive ){.    gene
16b80 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
16b90 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  eQuery(pParse, p
16ba0 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , &dest);.  }els
16bb0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  e.#endif..  /* C
16bc0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
16bd0 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
16be0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
16bf0 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
16c00 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
16c10 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
16c20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
16c30 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
16c40 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
16c50 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65    }else{..#ifnde
16c60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
16c70 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50  PLAIN.    if( pP
16c80 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
16c90 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  ){.      Explain
16ca0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16cb0 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  e, 1, "COMPOUND 
16cc0 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20  QUERY"));.      
16cd0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
16ce0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45  ((pParse, 1, "LE
16cf0 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59  FT-MOST SUBQUERY
16d00 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  "));.    }.#endi
16d10 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  f..    /* Genera
16d20 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
16d30 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
16d40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
16d50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69  ..    */.    swi
16d60 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
16d70 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
16d80 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61   {.        int a
16d90 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
16da0 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
16db0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
16dc0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
16dd0 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
16de0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
16df0 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
16e00 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d  or->iOffset = p-
16e10 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
16e20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
16e30 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
16e40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16e50 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16e60 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
16e70 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
16e80 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
16e90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
16ea0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16eb0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
16ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
16ed0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
16ee0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
16ef0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
16f00 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
16f10 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
16f20 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
16f30 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16f40 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
16f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f60 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
16f70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
16f80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16f90 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
16fa0 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
16fb0 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
16fc0 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ed"));.         
16fd0 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
16fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
16ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17000 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
17010 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
17040 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
17050 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
17060 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17070 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
17080 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
17090 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29  1, "UNION ALL"))
170a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
170b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
170c0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
170d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
170e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
170f0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65  );.        pDele
17100 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
17110 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
17120 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
17130 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
17140 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
17150 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
17160 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
17170 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ectRow);.       
17180 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
17190 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  mit.         && 
171a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
171b0 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
171c0 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69  mit->pLeft, &nLi
171d0 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26 26  mit).         &&
171e0 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
171f0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c  nSelectRow > sql
17200 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
17210 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  nLimit) .       
17220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
17230 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
17240 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17250 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  )nLimit);.      
17260 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17270 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
17280 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17290 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
172a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
172b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
172c0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
172d0 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73  XCEPT:.      cas
172e0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
172f0 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
17300 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
17310 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
17320 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  emp table holdin
17330 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
17340 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20      u8 op = 0;  
17350 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
17360 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
17370 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
17380 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  elf */.        i
17390 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
173a0 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
173b0 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
173c0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
173d0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
173e0 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53  *pLimit;    /* S
173f0 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
17400 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20  ->nLimit  */.   
17410 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
17420 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
17430 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a  t uniondest;.  .
17440 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17450 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
17460 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  PT );.        te
17470 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17480 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
17490 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
174a0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  _Union;.        
174b0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
174c0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
174d0 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
174e0 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
174f0 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
17500 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
17510 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  our.          **
17520 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
17530 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
17540 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
17550 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
17560 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
17570 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
17580 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
17590 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
175a0 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65  Parm;.        }e
175b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
175c0 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
175d0 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
175e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
175f0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
17600 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
17610 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
17620 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
17630 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
17640 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17650 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17660 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
17670 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
17680 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17690 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
176a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
176b0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
176c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
176d0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
176e0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
176f0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
17700 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
17710 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67           findRig
17720 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
17730 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
17740 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
17750 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
17760 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
17770 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
17780 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
17790 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
177a0 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  r left.        *
177b0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
177c0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
177d0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73  rBy );.        s
177e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
177f0 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
17800 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
17810 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ab);.        rc 
17820 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17830 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
17840 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
17850 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
17860 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
17870 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
17880 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
17890 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
178a0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
178b0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
178c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
178d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
178e0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
178f0 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
17900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17910 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17920 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
17930 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
17940 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
17950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17960 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
17970 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20         pLimit = 
17980 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
17990 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
179a0 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64  ;.        uniond
179b0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
179c0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
179d0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
179e0 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54  , 1, "%s USING T
179f0 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20  EMP B-TREE",.   
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e         selectOpN
17a20 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20  ame(p->op)));.  
17a30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17a40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17a50 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
17a60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17a70 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
17a80 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51   );.        /* Q
17a90 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
17aa0 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
17ab0 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
17ac0 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
17ad0 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
17ae0 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
17af0 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
17b00 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
17b10 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
17b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17b30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17b40 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
17b50 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
17b60 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
17b70 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
17b80 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
17b90 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
17ba0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
17bb0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
17bc0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
17bd0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
17be0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
17bf0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
17c00 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
17c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17c20 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
17c30 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
17c40 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
17c50 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
17c60 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
17c70 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
17c80 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20  Offset = 0;.  . 
17c90 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72         /* Conver
17ca0 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
17cb0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17cc0 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
17cd0 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  form.        ** 
17ce0 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
17cf0 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
17d00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17d10 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
17d20 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20  b==dest.iSDParm 
17d30 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
17d40 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
17d50 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
17d60 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
17d70 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
17d80 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
17d90 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17da0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
17db0 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65 61  .          iBrea
17dc0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
17dd0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
17de0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e  ;.          iCon
17df0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
17e00 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
17e10 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70  ;.          comp
17e20 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
17e30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
17e40 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
17e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e60 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17e70 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
17e80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17e90 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  v);.          iS
17ea0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
17eb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
17ed0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
17ee0 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, p, unionTab,
17ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f00 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
17f10 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
17f20 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
17f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17f40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
17f50 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
17f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17f70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
17f80 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
17f90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17fb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17fc0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
17fd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17fe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17ff0 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
18000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
18010 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
18030 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d  ault: assert( p-
18040 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43  >op==TK_INTERSEC
18050 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 69  T ); {.        i
18060 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
18070 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
18080 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
18090 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
180a0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
180b0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
180c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
180d0 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
180e0 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a 20      int r1;.  . 
180f0 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53         /* INTERS
18100 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
18110 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
18120 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
18130 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 77  es.        ** tw
18140 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18150 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
18160 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
18170 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20 2a   Begin.        *
18180 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
18190 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
181a0 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20  ll need..       
181b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62 31   */.        tab1
181c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
181d0 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32 20  +;.        tab2 
181e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
181f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18200 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
18210 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 61   );.  .        a
18220 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18240 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
18250 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  1, 0);.        a
18260 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
18270 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
18280 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
18290 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
182a0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
182b0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
182c0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
182d0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
182e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
182f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20 20  >pEList );.  .  
18300 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18310 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
18320 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
18330 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
18340 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  "..        */.  
18350 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
18360 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
18370 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
18380 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
18390 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183a0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
183b0 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
183c0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
183d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
183e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
183f0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
18400 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
18410 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
18420 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
18430 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18440 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 20  e "tab2".       
18450 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
18460 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18470 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
18480 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
18490 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
184a0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
184b0 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
184c0 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
184d0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
184e0 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
184f0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
18500 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
18510 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
18520 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
18530 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
18540 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
18550 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  2;.        Expla
18560 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
18570 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e  rse, 1, "%s USIN
18580 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a  G TEMP B-TREE",.
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
185b0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
185c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
185d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
185e0 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
185f0 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tdest);.        
18600 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
18610 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
18620 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
18630 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
18640 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
18650 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
18660 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
18670 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
18680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
18690 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
186a0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
186b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
186c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
186d0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
186e0 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
186f0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
18700 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
18710 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18720 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
18730 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
18740 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
18750 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
18760 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18770 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
18780 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
18790 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
187a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
187b0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 43  rse);.        iC
187c0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
187d0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
187e0 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  e);.        comp
187f0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
18800 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
18810 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
18820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18830 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
18840 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
18850 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18860 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
18870 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18880 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 53  rse);.        iS
18890 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
188a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
188b0 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
188c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
188d0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
188e0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
188f0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
18900 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
18910 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18920 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
18930 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18940 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
18950 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
18960 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31  (pParse, p, tab1
18970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18980 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
18990 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
189a0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
189b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
189c0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
189d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
189e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
189f0 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
18a00 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
18a10 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18a20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18a30 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
18a40 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
18a50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18a60 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
18a70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
18a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18a90 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
18aa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
18ab0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18ac0 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66 20   }.  .  #ifndef 
18ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18ae0 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  AIN.    if( p->p
18af0 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Next==0 ){.     
18b00 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
18b10 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
18b20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
18b30 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  .  .  /* Compute
18b40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18b50 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
18b60 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
18b70 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
18b80 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
18b90 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
18ba0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
18bb0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
18bc0 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
18bd0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
18be0 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
18bf0 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
18c00 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
18c10 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
18c20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
18c30 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
18c40 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
18c50 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
18c60 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
18c70 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
18c80 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
18c90 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
18ca0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
18cb0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
18cc0 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
18cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18ce0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
18cf0 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
18d00 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
18d30 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
18d40 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
18d50 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
18d60 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
18d70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
18d80 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
18d90 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
18da0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
18db0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
18dc0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
18dd0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
18de0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
18df0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
18e00 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
18e10 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
18e20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
18e50 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
18e60 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
18e70 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
18e80 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
18e90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
18ea0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
18eb0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
18ec0 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
18ed0 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
18ee0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
18ef0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18f00 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  T;.      goto mu
18f10 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18f20 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
18f30 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
18f40 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
18f50 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
18f60 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
18f70 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
18f80 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
18f90 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
18fa0 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
18fb0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
18fc0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
18fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18fe0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
18ff0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
19000 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
19010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
19020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
19030 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
19040 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
19050 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
19060 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
19070 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
19080 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
19090 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
190a0 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
190b0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
190c0 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
190d0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
190e0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
190f0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
19100 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
19110 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
19120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
19130 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19150 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
19160 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
19170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19180 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
19190 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
191a0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
191b0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
191e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
191f0 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
19200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19210 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
19220 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
19230 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
19240 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
19250 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
19260 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
19270 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
19280 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
19290 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
192a0 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
192b0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
192c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
192d0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
192e0 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73  ./*.** Error mes
192f0 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77  sage for when tw
19300 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  o or more terms 
19310 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
19320 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72  lect have differ
19330 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75  ent.** size resu
19340 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lt sets..*/.void
19350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
19360 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
19370 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19380 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
19390 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
193a0 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
193b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
193c0 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
193d0 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
193e0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
193f0 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c  f terms");.  }el
19400 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
19410 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19420 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
19430 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
19440 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
19450 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
19460 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
19470 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
19480 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
19490 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
194a0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
194b0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
194c0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
194d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
194e0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
194f0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
19500 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
19510 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
19520 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
19530 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
19540 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
19550 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
19560 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
19570 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
19580 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
19590 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
195a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
195b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
195c0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
195d0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
195e0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
195f0 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
19600 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
19610 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
19620 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
19630 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19640 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
19650 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
19660 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
19670 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
19680 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
19690 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
196a0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
196b0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
196c0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
196d0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
196e0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
196f0 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
19700 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
19710 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
19720 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
19730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
19740 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
19750 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
19760 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
19770 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
19780 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
19790 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
197a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
197d0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
197e0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
197f0 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
19800 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
19810 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
19820 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
19830 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
19840 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
19850 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
19860 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
19870 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
19880 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
19890 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
198a0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
198b0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
198c0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
198d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
198e0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
198f0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
19900 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
19910 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19930 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
19940 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
19950 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
19960 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19970 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
19980 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
19990 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
199a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
199b0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
199c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
199d0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
199e0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
199f0 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
19a00 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
19a10 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
19a20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
19a30 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
19a40 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
19a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19a60 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
19a70 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
19a80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19a90 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
19aa0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19ab0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
19ac0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
19ad0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
19b00 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
19b10 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
19b20 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
19b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19b40 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
19b50 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
19b60 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
19b70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19b80 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19b90 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
19ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19bb0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
19bc0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
19bd0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
19be0 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
19bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19c00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
19c10 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
19c20 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
19c30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
19c40 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
19c50 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
19c60 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
19c70 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
19c80 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
19c90 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
19ca0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
19cb0 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
19cc0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
19cd0 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
19ce0 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
19cf0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
19d00 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
19d10 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
19d20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
19d30 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
19d40 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
19d50 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
19d60 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
19d70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
19d80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19d90 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19da0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
19db0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19dc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
19dd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19de0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
19df0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
19e00 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
19e30 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
19e40 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
19e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e60 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
19e70 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
19e80 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
19e90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19ea0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
19eb0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
19ec0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19ed0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
19ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19ef0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19f00 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
19f10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
19f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19f30 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
19f40 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
19f50 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
19f60 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
19f70 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f  CT ...)"..    */
19f80 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
19f90 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
19fa0 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1;.      testcas
19fb0 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20  e( pIn->nSdst>1 
19fc0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
19fd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19fe0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a000 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
1a010 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
1a020 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20  In->nSdst, .    
1a030 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
1a040 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e  >zAffSdst, pIn->
1a050 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1a070 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
1a080 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
1a090 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  rm, r1,.        
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70     pIn->iSdst, p
1a0c0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
1a0d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a0e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a0f0 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
1a100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a110 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
1a120 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
1a130 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
1a140 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
1a150 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
1a160 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
1a170 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
1a180 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
1a190 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
1a1a0 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
1a1b0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
1a1c0 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
1a1d0 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73  ssert( pIn->nSds
1a1e0 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t==1 || pParse->
1a1f0 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63  nErr>0 );  testc
1a200 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21  ase( pIn->nSdst!
1a210 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
1a220 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
1a230 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
1a240 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
1a250 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
1a260 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
1a270 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
1a280 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
1a290 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
1a2a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1a2b0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1a2c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1a2d0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
1a2e0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1a2f0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
1a300 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
1a310 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1a320 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
1a330 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
1a340 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
1a350 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
1a360 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
1a370 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
1a380 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1a390 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1a3a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a3b0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
1a3c0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
1a3d0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
1a3e0 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
1a3f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1a400 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
1a410 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
1a420 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
1a430 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a450 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
1a460 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a470 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a480 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a490 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
1a4a0 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1a4b0 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
1a4c0 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
1a4d0 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
1a4e0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
1a4f0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
1a500 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
1a510 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
1a520 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
1a530 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
1a540 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
1a550 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
1a560 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
1a570 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1a580 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1a590 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
1a5a0 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
1a5b0 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
1a5c0 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
1a5d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
1a5e0 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
1a5f0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
1a600 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
1a610 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1a620 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
1a630 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
1a640 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
1a650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a660 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
1a670 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a680 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a6a0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a6b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
1a6c0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
1a6d0 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
1a6e0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a6f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a700 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a710 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
1a720 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
1a730 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a740 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a750 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
1a760 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
1a770 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a780 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
1a790 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
1a7a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a7b0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
1a7c0 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
1a7d0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
1a7e0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
1a7f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
1a800 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
1a810 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
1a820 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
1a830 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
1a840 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
1a850 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
1a860 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
1a870 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
1a880 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
1a890 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
1a8a0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
1a8b0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1a8c0 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
1a8d0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
1a8e0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
1a8f0 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
1a900 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
1a910 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
1a920 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
1a930 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a940 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
1a950 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
1a960 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
1a970 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
1a980 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1a990 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1a9a0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
1a9b0 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
1a9c0 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
1a9d0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
1a9e0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
1a9f0 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
1aa00 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
1aa10 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1aa20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
1aa30 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1aa40 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1aa50 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1aa60 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1aa70 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
1aa80 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aa90 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
1aaa0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aab0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aac0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aad0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1aae0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
1aaf0 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
1ab00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
1ab10 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
1ab20 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
1ab30 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
1ab40 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
1ab50 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
1ab60 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
1ab70 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
1ab80 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
1ab90 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
1aba0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1abb0 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
1abc0 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
1abd0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1abe0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1abf0 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
1ac00 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
1ac10 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1ac20 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1ac30 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1ac40 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
1ac50 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
1ac60 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ac70 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1ac80 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
1ac90 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
1aca0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
1acb0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
1acc0 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
1acd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1ace0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
1acf0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
1ad00 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
1ad10 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
1ad20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
1ad30 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1ad40 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
1ad50 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
1ad60 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
1ad70 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
1ad80 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1ad90 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1ada0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1adb0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1adc0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
1add0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1ade0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1adf0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1ae00 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
1ae10 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
1ae20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ae30 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
1ae40 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae50 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae60 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
1ae70 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1ae80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae90 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
1aea0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
1aeb0 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
1aec0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1aed0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aee0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
1aef0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1af00 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
1af10 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
1af20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
1af30 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af40 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
1af50 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
1af60 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
1af70 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
1af80 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
1af90 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
1afa0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1afb0 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
1afc0 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
1afd0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
1afe0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1aff0 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
1b000 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
1b010 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
1b020 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
1b030 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
1b040 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
1b050 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
1b060 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1b070 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
1b080 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
1b090 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
1b0a0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
1b0b0 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
1b0c0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
1b0d0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
1b0e0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
1b0f0 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
1b100 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
1b110 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
1b120 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
1b130 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
1b140 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
1b150 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
1b160 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
1b170 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
1b180 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
1b190 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
1b1a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b1b0 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
1b1c0 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
1b1d0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
1b1e0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
1b1f0 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
1b200 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
1b210 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
1b220 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
1b230 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
1b240 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
1b250 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
1b260 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
1b270 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
1b280 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
1b290 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
1b2a0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
1b2b0 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
1b2c0 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
1b2d0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
1b2e0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
1b2f0 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
1b300 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
1b310 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
1b320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
1b330 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
1b340 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
1b350 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
1b360 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
1b370 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b380 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
1b390 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
1b3a0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
1b3b0 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
1b3c0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
1b3d0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
1b3e0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
1b3f0 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
1b400 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
1b410 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
1b420 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
1b430 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
1b440 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
1b450 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
1b460 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
1b470 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
1b480 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
1b490 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
1b4a0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
1b4b0 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
1b4c0 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
1b4d0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
1b4e0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
1b4f0 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
1b500 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
1b510 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
1b520 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
1b530 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
1b540 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b550 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1b560 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
1b570 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
1b580 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
1b590 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1b5a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b5b0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b5c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1b5d0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b5e0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
1b5f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
1b600 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
1b610 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1b620 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
1b630 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1b640 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1b650 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b660 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1b670 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
1b680 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
1b690 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
1b6a0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
1b6b0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b6c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b6d0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
1b6e0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b6f0 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
1b700 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
1b710 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
1b720 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
1b730 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b740 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b750 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
1b760 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
1b770 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b780 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b790 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b7a0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
1b7b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b7c0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1b7d0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b7e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b7f0 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
1b800 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b810 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
1b820 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b830 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
1b840 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b850 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b860 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
1b870 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b880 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b890 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
1b8a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8b0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
1b8c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b8d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
1b8e0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
1b8f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b900 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
1b910 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b920 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b930 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b940 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
1b950 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b960 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b970 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b980 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
1b990 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b9a0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
1b9b0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
1b9c0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9d0 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
1b9e0 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
1b9f0 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
1ba00 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
1ba10 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
1ba20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba30 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
1ba40 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1ba50 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba60 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
1ba70 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba80 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
1ba90 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
1baa0 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
1bab0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
1bac0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
1bad0 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
1bae0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1baf0 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
1bb00 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bb10 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
1bb20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
1bb30 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1bb40 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
1bb50 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
1bb60 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1bb70 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1bb80 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
1bb90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
1bba0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
1bbb0 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
1bbc0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
1bbd0 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
1bbe0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bbf0 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
1bc00 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
1bc10 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
1bc20 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc30 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
1bc40 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
1bc50 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bc60 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc70 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1bc80 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
1bc90 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
1bca0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
1bcb0 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
1bcc0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
1bcd0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
1bce0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
1bcf0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1bd00 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
1bd10 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bd30 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
1bd40 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
1bd50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
1bd60 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bd70 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
1bd80 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bd90 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
1bda0 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
1bdb0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
1bdc0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
1bdd0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
1bde0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
1bdf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1be00 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
1be10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1be30 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
1be40 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1be50 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
1be60 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1be70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1be80 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1be90 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1bea0 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
1beb0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
1bec0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
1bed0 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
1bee0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
1bef0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1bf00 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1bf10 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1bf20 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1bf30 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1bf40 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1bf50 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1bf60 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1bf70 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1bf80 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1bf90 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1bfa0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1bfb0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1bfc0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1bfd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bfe0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
1bff0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1c000 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1c010 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 0a 20  bel(pParse);... 
1c020 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
1c030 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c040 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
1c050 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
1c060 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
1c070 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
1c080 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
1c090 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1c0a0 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
1c0b0 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
1c0c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1c0d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
1c0e0 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
1c0f0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1c100 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
1c110 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
1c120 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
1c130 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
1c140 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
1c150 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
1c160 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
1c170 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c180 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
1c190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
1c1a0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
1c1b0 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
1c1c0 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
1c1d0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
1c1e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
1c1f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c200 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c210 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1c220 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
1c230 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
1c240 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1c250 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c260 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c270 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1c280 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c290 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
1c2a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c2b0 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
1c2c0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
1c2d0 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
1c2e0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
1c2f0 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
1c300 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1c310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c320 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1c330 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1c340 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
1c350 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
1c360 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
1c370 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1c380 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
1c390 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1c3a0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1c3b0 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
1c3c0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1c3d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
1c3e0 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
1c3f0 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
1c400 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
1c410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1c420 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
1c430 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
1c440 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
1c450 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
1c460 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
1c470 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
1c480 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
1c490 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
1c4a0 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
1c4b0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
1c4c0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
1c4d0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
1c4e0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
1c4f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1c500 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
1c510 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
1c520 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
1c530 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
1c540 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
1c550 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
1c560 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
1c570 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
1c580 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1c590 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
1c5a0 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42  of(int)*(nOrderB
1c5b0 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61  y + 1));.  if( a
1c5c0 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
1c5d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c5e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c5f0 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f  aPermute[0] = nO
1c600 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28  rderBy;.    for(
1c610 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=1, pItem=pOrde
1c620 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65  rBy->a; i<=nOrde
1c630 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
1c640 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1c650 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c660 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1c670 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c680 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c690 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
1c6a0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
1c6b0 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
1c6c0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c6d0 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
1c6e0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
1c6f0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1c700 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
1c710 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
1c720 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c730 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
1c740 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
1c750 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
1c760 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1c770 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1c780 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
1c790 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
1c7a0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
1c7b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
1c7c0 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
1c7d0 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
1c7e0 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
1c7f0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
1c800 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
1c810 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
1c820 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
1c830 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
1c840 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
1c850 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
1c860 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1c870 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
1c880 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
1c890 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1c8a0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
1c8b0 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
1c8c0 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
1c8d0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
1c8e0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1c8f0 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
1c900 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1c910 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
1c920 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
1c930 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1c940 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
1c950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c960 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1c970 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
1c980 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
1c990 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
1c9a0 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
1c9b0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
1c9c0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
1c9d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
1c9e0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
1c9f0 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
1ca00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1ca10 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1ca20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
1ca30 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
1ca40 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1ca50 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
1ca60 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
1ca70 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
1ca80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
1ca90 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
1caa0 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
1cab0 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
1cac0 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
1cad0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
1cae0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1caf0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1cb00 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1cb10 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
1cb20 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1cb30 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
1cb40 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
1cb50 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1cb60 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
1cb70 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1cb80 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1cb90 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
1cba0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1cbb0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
1cbc0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
1cbd0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
1cbe0 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
1cbf0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
1cc00 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
1cc10 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
1cc20 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cc30 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
1cc40 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cc50 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1cc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cc70 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
1cc80 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
1cc90 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ccc0 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
1ccd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cce0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
1ccf0 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
1cd00 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
1cd10 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
1cd20 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
1cd30 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1cd40 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
1cd50 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
1cd60 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1cd70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cd80 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1cd90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cda0 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1cdb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1cdc0 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1cdd0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1cde0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1cdf0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1ce00 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1ce10 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1ce20 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1ce30 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1ce40 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 45   regAddrB);..  E
1ce50 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1ce60 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45 52  (pParse, 1, "MER
1ce70 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63 74  GE (%s)", select
1ce80 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
1ce90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1cea0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1ceb0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1cec0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1ced0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1cee0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1cef0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1cf00 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1cf10 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1cf20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1cf30 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1cf40 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1cf50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1cf60 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1cf70 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1cf80 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1cf90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1cfa0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1cfb0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1cfc0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c  egLimitA;.  Expl
1cfd0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
1cfe0 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22 29  arse, 1, "LEFT")
1cff0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1d000 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1d010 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1d020 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1d030 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1d040 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1d050 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1d060 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1d070 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1d080 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1d090 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d0a0 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1d0b0 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1d0c0 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1d0d0 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1d0e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1d0f0 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1d100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d110 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1d120 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1d130 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1d140 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1d150 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1d160 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1d170 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1d180 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1d190 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1d1a0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1d1b0 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1d1c0 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45 78  fset = 0;  .  Ex
1d1d0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1d1e0 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47 48  pParse, 1, "RIGH
1d1f0 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  T"));.  sqlite3S
1d200 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1d210 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
1d220 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
1d230 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
1d240 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
1d250 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1d260 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1d270 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1d280 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d290 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1d2a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d2b0 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
1d2c0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1d2d0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1d2e0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1d2f0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
1d300 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d310 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1d320 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
1d330 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
1d340 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1d350 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1d360 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1d370 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
1d380 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
1d390 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1d3a0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1d3b0 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
1d3c0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d3d0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1d3e0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1d3f0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
1d400 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1d410 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1d420 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1d430 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d440 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1d450 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
1d460 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d470 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d480 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
1d490 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
1d4a0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1d4b0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1d4d0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1d4e0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1d4f0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1d500 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1d510 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1d520 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1d530 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1d540 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d550 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1d560 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1d570 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1d580 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1d590 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1d5a0 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1d5b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d5c0 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1d5d0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d5e0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1d5f0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1d600 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1d610 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d620 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d630 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1d640 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1d650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d660 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d670 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1d680 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1d690 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1d6a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d6b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1d6c0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d710 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1d720 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1d730 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1d740 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1d750 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1d760 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1d770 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d780 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d790 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d7a0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d7b0 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1d7c0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d7d0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1d7e0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d7f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1d800 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d810 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1d820 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1d830 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1d840 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1d850 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1d860 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d870 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d880 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d890 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1d8a0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d8b0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1d8c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d8d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d8e0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1d8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d900 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1d910 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1d920 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1d930 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d940 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1d950 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1d960 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d970 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1d980 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1d990 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d9a0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1d9b0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1d9c0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1d9d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d9e0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1d9f0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1da00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1da10 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1da20 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1da30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1da40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1da50 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1da60 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1da70 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1da80 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1da90 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1daa0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1dab0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1dac0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1dad0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1dae0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1daf0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1db00 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1db10 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1db20 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1db30 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1db40 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1db50 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1db60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1db70 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1db80 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1db90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1dba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1dbb0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1dbc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1dbd0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1dbe0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1dbf0 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1dc00 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1dc10 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1dc20 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1dc30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1dc40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1dc50 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1dc60 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1dc70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dc80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1dc90 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1dca0 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1dcb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dcc0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1dcd0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1dce0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1dcf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dd00 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1dd10 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1dd20 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1dd30 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1dd40 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1dd50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1dd60 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1dd70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dd80 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dd90 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dda0 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1ddb0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1ddc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ddd0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dde0 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1ddf0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1de00 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1de10 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1de20 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1de30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1de40 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1de50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1de60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1de70 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1de80 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1de90 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1dea0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1deb0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1dec0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1ded0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1dee0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1df10 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1df20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1df30 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1df40 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1df50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1df60 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1df70 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1df80 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1df90 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1dfa0 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1dfb0 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1dfc0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1dfd0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1dfe0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1dff0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1e000 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73  nd);..  /* Reass
1e010 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1e020 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1e030 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1e040 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1e050 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1e060 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1e070 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1e080 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1e090 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1e0a0 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1e0b0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1e0c0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1e0d0 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1e0e0 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1e0f0 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1e100 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1e110 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1e120 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1e130 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  */.  ExplainQuer
1e140 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
1e150 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1e160 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1e170 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1e180 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e190 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1e1a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e1b0 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e  _VIEW)../* An in
1e1c0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75  stance of the Su
1e1d0 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  bstContext objec
1e1e0 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20 73  t describes an s
1e1f0 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74  ubstitution edit
1e200 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72  .** to be perfor
1e210 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74  med on a parse t
1e220 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72  ree..**.** All r
1e230 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
1e240 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54  umns in table iT
1e250 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72  able are to be r
1e260 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65  eplaced by corre
1e270 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72  sponding.** expr
1e280 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73  essions in pELis
1e290 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1e2a0 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78  ruct SubstContex
1e2b0 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  t {.  Parse *pPa
1e2c0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1e2d0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1e2e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1e2f0 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  iTable;         
1e300 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1e310 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e320 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
1e330 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20  nt iNewTable;   
1e340 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1e350 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  table number */.
1e360 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
1e370 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1e380 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  dd TK_IF_NULL_RO
1e390 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63  W opcodes on eac
1e3a0 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f  h replacement */
1e3b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1e3c0 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
1e3d0 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72  Replacement expr
1e3e0 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62  essions */.} Sub
1e3f0 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46  stContext;../* F
1e400 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1e410 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1e420 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1e430 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1e440 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1e450 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1e460 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ect(SubstContext
1e470 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29  *, Select*, int)
1e480 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1e490 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1e4a0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1e4b0 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1e4c0 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1e4d0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1e4e0 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1e4f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1e500 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1e510 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1e520 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1e530 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1e540 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1e550 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1e560 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1e570 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1e580 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1e590 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1e5a0 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1e5b0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1e5c0 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1e5d0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1e5e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1e5f0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1e600 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1e610 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1e620 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1e630 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1e640 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1e650 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
1e660 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1e670 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1e680 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1e690 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1e6a0 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1e6b0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1e6c0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1e6d0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1e6e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1e6f0 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1e700 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1e710 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69  ubst,  /* Descri
1e720 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1e730 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1e740 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
1e750 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
1e760 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
1e770 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ion occurs */.){
1e780 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1e790 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1e7a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1e7b0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
1e7c0 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70  Join).   && pExp
1e7d0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e7e0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e7f0 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  le.  ){.    pExp
1e800 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e810 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1e820 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
1e830 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1e840 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1e850 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1e860 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  >iTable ){.    i
1e870 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1e880 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1e890 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1e8a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e8b0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1e8c0 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79       Expr *pCopy
1e8d0 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73   = pSubst->pELis
1e8e0 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1e8f0 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
1e900 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77    Expr ifNullRow
1e910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e920 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d  pSubst->pEList!=
1e930 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
1e940 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69  umn<pSubst->pELi
1e950 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1e960 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e970 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1e980 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e990 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1e9a0 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1e9b0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1e9c0 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1e9d0 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1e9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ea00 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1ea10 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1ea20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1ea30 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1ea40 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1ea50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1ea60 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1ea70 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1ea80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1ea90 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1eaa0 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1eab0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1eac0 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1ead0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1eae0 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1eaf0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1eb00 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1eb10 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1eb20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
1eb30 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73 50  stcase( ExprHasP
1eb40 72 6f 70 65 72 74 79 28 70 43 6f 70 79 2c 20 45  roperty(pCopy, E
1eb50 50 5f 53 75 62 71 75 65 72 79 29 20 29 3b 0a 20  P_Subquery) );. 
1eb60 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1eb70 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1eb80 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1eb90 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1eba0 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1ebb0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
1ebc0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1ebd0 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75  pNew, EP_CanBeNu
1ebe0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
1ebf0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1ec00 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1ec10 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d  ty(pExpr,EP_From
1ec20 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1ec30 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a     pNew->iRightJ
1ec40 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72  oinTable = pExpr
1ec50 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ec60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e;.          Exp
1ec70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1ec80 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  w, EP_FromJoin);
1ec90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eca0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1ecb0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1ecc0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
1ecd0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1ece0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ecf0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1ed00 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
1ed10 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1ed20 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1ed30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1ed40 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  >iTable = pSubst
1ed50 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1ed60 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c   }.    pExpr->pL
1ed70 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1ed80 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70  pSubst, pExpr->p
1ed90 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72  Left);.    pExpr
1eda0 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1edb0 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78  Expr(pSubst, pEx
1edc0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
1edd0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ede0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1edf0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ee00 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
1ee10 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1ee20 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1ee30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1ee40 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1ee50 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  st, pExpr->x.pLi
1ee60 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
1ee70 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
1ee80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1ee90 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75  stExprList(.  Su
1eea0 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1eeb0 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1eec0 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1eed0 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1eee0 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
1eef0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1ef00 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1ef10 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1ef20 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1ef30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1ef50 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1ef60 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1ef70 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1ef80 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  r = substExpr(pS
1ef90 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ubst, pList->a[i
1efa0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  ].pExpr);.  }.}.
1efb0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1efc0 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74  tSelect(.  Subst
1efd0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1efe0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1eff0 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1f000 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1f010 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1f020 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f030 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
1f040 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
1f050 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1f060 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
1f070 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f  Do substitutes o
1f080 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20  n p->pPrior too 
1f090 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1f0a0 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1f0b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f0c0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1f0d0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1f0e0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74  .  do{.    subst
1f0f0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f100 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1f110 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1f120 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70  Subst, p->pGroup
1f130 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  By);.    substEx
1f140 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1f150 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1f160 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1f170 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f180 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1f190 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1f1a0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1f1b0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70  ->pWhere);.    p
1f1c0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1f1d0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21     assert( pSrc!
1f1e0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1f1f0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1f200 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1f210 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1f220 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1f230 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f240 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1f250 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f260 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1f270 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f280 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ist(pSubst, pIte
1f290 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1f2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f2b0 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1f2c0 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1f2d0 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1f2e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1f2f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f300 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1f310 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1f320 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1f330 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f340 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1f350 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f360 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1f370 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1f380 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1f390 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1f3a0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1f3b0 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1f3c0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1f3d0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1f3e0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1f3f0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1f400 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1f410 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1f420 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1f430 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1f440 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1f450 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1f460 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1f470 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f480 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f490 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1f4a0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1f4b0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1f4c0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1f4d0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1f4e0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1f4f0 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1f500 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1f510 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1f520 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1f530 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1f540 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1f550 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1f560 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1f570 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1f580 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1f590 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1f5a0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1f5b0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1f5c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1f5d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f5e0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1f5f0 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1f600 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f610 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1f620 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1f630 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1f640 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1f650 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1f660 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1f670 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1f680 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1f690 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1f6a0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1f6b0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1f6c0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1f6d0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1f6e0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1f6f0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1f700 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1f710 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1f720 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1f730 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1f740 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1f750 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1f760 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1f770 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1f780 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  s subject to the
1f790 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1f7a0 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28  raints:.**.**  (
1f7b0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f7c0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f7d0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f7e0 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f7f0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1f800 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1f810 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1f820 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65 67  t both be aggreg
1f830 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1f840 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1f850 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1f860 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1f870 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a  queries. Was:.**
1f880 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20 74          (2) If t
1f890 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1f8a0 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65 6e  n aggregate then
1f8b0 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29 20  .**        (2a) 
1f8c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f8d0 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f  must not be a jo
1f8e0 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  in and.**       
1f8f0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1f900 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 75  query must not u
1f910 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  se subqueries.**
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
1f930 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
1f940 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1f950 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1f960 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20 20  andidate.**     
1f970 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61 74          for flat
1f980 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20 69  tening.  (This i
1f990 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20  s due to ticket 
1f9a0 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1f9b0 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  80].**          
1f9c0 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d     from 2015-02-
1f9d0 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1f9e0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1f9f0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1fa00 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1fa10 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20   JOIN then.**   
1fa20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73 75       (3a) the su
1fa30 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1fa40 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1fa50 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65 20         (3b) the 
1fa60 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fa70 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1fa80 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 69  not contain a vi
1fa90 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  rtual.**        
1faa0 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a       table and.*
1fab0 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74 68  *        (3c) th
1fac0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1fad0 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1fae0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  egate..**.**   (
1faf0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1fb00 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53 54   can not be DIST
1fb10 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1fb20 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1fb30 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1fb40 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1fb50 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1fb60 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1fb70 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1fb80 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1fb90 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1fba0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1fbb0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1fbc0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1fbd0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1fbe0 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1fbf0 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1fc00 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1fc10 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1fc20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1fc30 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1fc40 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1fc50 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fc60 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1fc70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fc80 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e  ay not be DISTIN
1fc90 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1fca0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 75   The subquery mu
1fcb0 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
1fcc0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1fcd0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1fce0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1fcf0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1fd00 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1fd10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1fd20 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1fd30 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1fd40 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1fd50 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1fd60 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1fd70 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1fd80 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1fd90 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65 20  *   (8)  If the 
1fda0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fdb0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fdc0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fdd0 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   be a join..**.*
1fde0 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65 20  *   (9)  If the 
1fdf0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fe00 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fe10 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fe20 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   be aggregate..*
1fe30 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74  *.**  (**)  Rest
1fe40 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73  riction (10) was
1fe50 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1fe60 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30  e code on 2005-0
1fe70 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20  2-05 but we.**  
1fe80 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79        accidently
1fe90 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d   carried the com
1fea0 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74  ment forward unt
1feb0 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20  il 2014-09-15.  
1fec0 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  Original.**     
1fed0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22     constraint: "
1fee0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fef0 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68 65  is aggregate the
1ff00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ff10 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61 79  y .**        may
1ff20 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1ff30 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1ff40 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ff50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1ff60 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  ay not both have
1ff70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ff80 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1ff90 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1ffa0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1ffb0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1ffc0 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1ffd0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1ffe0 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1fff0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
20000 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
20010 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
20020 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
20030 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20040 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
20050 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
20060 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20070 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
20080 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68 65  **  (15)  If the
20090 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
200a0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
200b0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
200c0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
200d0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75  bquery may not u
200e0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20  se LIMIT..**    
200f0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
20100 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
20110 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
20120 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66 20  **.**  (16)  If 
20130 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20140 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  is aggregate, th
20150 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20  en the subquery 
20160 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  may not.**      
20170 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e 20    use ORDER BY. 
20180 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
20190 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
201a0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
201b0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
201c0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
201d0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
201e0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
201f0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
20200 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20210 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a   select, then.**
20220 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61 6c          (17a) al
20230 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  l compound opera
20240 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20 55  tors must be a U
20250 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a  NION ALL, and.**
20260 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e 6f          (17b) no
20270 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68   terms within th
20280 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
20290 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72 65  und may be aggre
202a0 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  gate.**         
202b0 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43 54       or DISTINCT
202c0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
202d0 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72 6d  (17c) every term
202e0 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71   within the subq
202f0 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75  uery compound mu
20300 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
20310 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  lause.**        
20320 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72 20  (17d) the outer 
20330 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20340 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20350 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61 74   (17d1) aggregat
20360 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  e, or.**        
20370 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49 53        (17d2) DIS
20380 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20  TINCT, or.**    
20390 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33 29            (17d3)
203a0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
203b0 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
203c0 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
203d0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
203e0 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
203f0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
20400 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
20410 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
20420 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
20430 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
20440 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
20450 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
20460 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
20470 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
20480 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
20490 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
204a0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
204b0 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
204c0 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
204d0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
204e0 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
204f0 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
20500 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
20510 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
20520 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
20530 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
20540 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
20550 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
20560 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
20570 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
20580 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
20590 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
205a0 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
205b0 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
205c0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
205d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
205e0 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
205f0 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
20600 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
20610 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
20620 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
20630 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
20640 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
20650 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
20660 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
20670 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
20680 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
20690 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
206a0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
206b0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
206c0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
206d0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
206e0 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
206f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
20700 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
20710 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
20720 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
20730 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
20740 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
20750 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  19)  If the subq
20760 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20770 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20780 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  uery may not.** 
20790 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
207a0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
207b0 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
207c0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
207d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
207e0 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
207f0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
20800 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20810 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
20820 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
20830 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
20840 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
20850 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
20860 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
20870 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20880 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
20890 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
208a0 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
208b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
208c0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
208d0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
208e0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
208f0 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
20900 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
20910 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
20920 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  1)  If the subqu
20930 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74  ery uses LIMIT t
20940 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
20950 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ery may not be.*
20960 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
20970 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
20980 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
20990 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
209a0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
209b0 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65 20   be a recursive 
209c0 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  CTE..**.**  (**)
209d0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
209e0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
209f0 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68 65  3).  Was: If the
20a00 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 0a   outer query is.
20a10 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63 75  **        a recu
20a20 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e 20  rsive CTE, then 
20a30 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 61  the sub-query ma
20a40 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f  y not be a compo
20a50 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20  und query..**   
20a60 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72 69       This restri
20a70 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
20a80 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
20a90 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
20aa0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
20ab0 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
20ac0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
20ad0 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
20ae0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
20af0 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
20b00 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ()..**.**  (**) 
20b10 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
20b20 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
20b30 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
20b40 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
20b50 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
20b60 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20b70 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
20b80 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
20b90 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
20ba0 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
20bb0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
20bc0 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
20bd0 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
20be0 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
20bf0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
20c00 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
20c10 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
20c20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
20c30 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
20c40 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
20c50 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
20c60 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32  imal.).**.**  (2
20c70 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74 68  5)  If either th
20c80 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74 68  e subquery or th
20c90 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 63  e parent query c
20ca0 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f 77  ontains a window
20cb0 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63 74  .**        funct
20cc0 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65 63  ion in the selec
20cd0 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52 20  t list or ORDER 
20ce0 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74 74  BY clause, flatt
20cf0 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  ening.**        
20d00 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20d10 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ..**.**.** In th
20d20 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
20d30 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
20d40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20d50 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
20d60 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
20d70 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
20d80 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
20d90 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
20da0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
20db0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
20dc0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20dd0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
20de0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20df0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
20e00 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
20e10 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
20e20 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
20e30 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
20e40 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
20e50 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
20e60 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
20e70 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
20e80 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
20e90 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
20ea0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
20eb0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
20ec0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
20ed0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
20ee0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
20ef0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20f00 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
20f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20f20 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
20f30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
20f40 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
20f50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20f60 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
20f70 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
20f80 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
20f90 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20   isAgg          
20fa0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
20fb0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
20fc0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20fd0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
20fe0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
20ff0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
21000 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
21010 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
21020 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
21030 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
21040 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
21050 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
21060 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
21070 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21080 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
21090 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
210a0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
210b0 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
210c0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
210d0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
210e0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
210f0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21100 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
21110 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
21120 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
21130 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
21140 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
21150 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
21160 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
21170 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
21180 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
21190 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
211a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
211b0 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52  Parent = -1;/* R
211c0 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65  eplacement table
211d0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a   for iParent */.
211e0 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
211f0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
21200 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67   pSub is the rig
21210 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46  ht side of a LEF
21220 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20  T JOIN */    .  
21230 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21240 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21250 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
21260 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
21270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21280 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
21290 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
212a0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
212b0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
212c0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
212d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
212e0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
212f0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
21300 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
21310 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
21320 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
21330 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
21340 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
21350 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  0 );.  if( Optim
21360 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
21370 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
21380 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
21390 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
213a0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
213b0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
213c0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
213d0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
213e0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
213f0 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
21400 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
21410 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
21420 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
21430 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
21440 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ub!=0 );..#ifnde
21450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
21460 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
21470 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e  ->pWin || pSub->
21480 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  pWin ) return 0;
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
214b0 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a   (25) */.#endif.
214c0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
214d0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
214e0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
214f0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
21500 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
21510 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
21520 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
21530 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
21540 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
21550 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
21560 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
21570 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
21580 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
21590 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
215a0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
215b0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
215c0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
215d0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
215e0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
215f0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21600 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
21610 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
21620 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
21630 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
21640 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
21650 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
21660 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21670 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21680 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
21690 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
216a0 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
216b0 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
216c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
216d0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
216e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
216f0 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
21700 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
21710 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21750 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
21760 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
21770 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
21780 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217a0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
217b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
217d0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
217e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
217f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
21800 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21810 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
21820 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
21830 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
21840 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
21850 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
21860 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
21870 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
21880 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
21890 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
218d0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
218e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
218f0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
21900 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21920 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
21930 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21940 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
21950 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21970 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
21980 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21990 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
219a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
219b0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
219c0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
219d0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
219e0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
219f0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
21a00 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
21a10 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
21a20 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
21a30 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
21a40 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
21a50 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21a60 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21a70 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21a80 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
21a90 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
21aa0 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
21ab0 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
21ac0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
21ad0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
21ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
21af0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
21b00 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
21b10 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
21b20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
21b30 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
21b40 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
21b50 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
21b60 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
21b70 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
21b80 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
21b90 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
21ba0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
21bb0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21bc0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21bd0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21be0 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
21bf0 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
21c00 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
21c10 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
21c20 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
21c30 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
21c40 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
21c50 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
21c60 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
21c70 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
21c80 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
21c90 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
21ca0 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
21cb0 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
21cc0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
21cd0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
21ce0 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
21cf0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
21d00 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
21d10 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
21d20 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
21d30 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
21d40 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
21d50 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
21d60 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
21d70 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
21d80 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
21d90 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
21da0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
21db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21dc0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
21dd0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
21de0 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
21df0 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
21e00 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
21e10 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
21e20 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
21e30 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
21e40 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
21e50 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
21e60 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
21e70 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
21e80 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
21e90 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
21ea0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
21eb0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
21ec0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
21ed0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
21ee0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
21ef0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
21f00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21f10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
21f20 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
21f30 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21f40 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
21f50 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
21f60 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
21f70 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
21f80 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
21f90 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
21fa0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
21fb0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
21fc0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
21fd0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
21fe0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
21ff0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
22000 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
22010 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
22020 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
22030 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22040 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
22050 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
22060 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
22070 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
22080 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
22090 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
220a0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
220b0 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
220c0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
220d0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
220e0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
220f0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
22100 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
22110 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22120 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22130 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22140 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
22150 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
22160 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
22170 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
22180 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
22190 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
221a0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
221b0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221c0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
221d0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
221e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
221f0 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
22200 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
22210 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22220 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22230 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
22240 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
22250 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
22260 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
22270 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22290 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
222a0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
222b0 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
222e0 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
222f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
22300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
22310 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
22320 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
22330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22340 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
22350 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
22360 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22370 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
22380 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
22390 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
223a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
223b0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
223c0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
223d0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
223e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
223f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
22400 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
22410 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
22420 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
22430 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
22440 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
22450 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
22460 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
22470 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
22480 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
22490 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
224a0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
224b0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
224c0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
224d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
224e0 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
224f0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
22500 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
22510 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
22520 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
22530 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
22540 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
22550 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
22560 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
22570 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
22580 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
22590 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
225a0 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 75  e,p,("flatten %u
225b0 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
225c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
225d0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65          pSub->se
225e0 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  lId, pSub, iFrom
225f0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
22600 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
22610 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22620 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22630 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22640 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22650 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22660 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
22670 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
22680 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
22690 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
226a0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
226b0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226c0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
226d0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
226e0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
226f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
22700 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
22710 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22720 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22730 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22740 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22750 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22760 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
22770 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
22780 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
22790 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
227a0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
227b0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227c0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
227d0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
227e0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
227f0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
22800 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
22810 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22820 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22830 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22840 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22850 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22860 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
22870 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
22880 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
22890 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
228a0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
228b0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228c0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
228d0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
228e0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
228f0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
22900 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
22910 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22920 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22930 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22940 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22950 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22960 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22970 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22980 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
22990 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
229a0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
229b0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229c0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
229d0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
229e0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
229f0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
22a00 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
22a10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a20 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a30 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a40 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a50 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a60 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22a70 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22a80 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22a90 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22aa0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22ab0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22ac0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22ad0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22ae0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22af0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22b00 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22b10 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b20 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b30 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b40 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b50 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b60 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22b70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22b80 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22b90 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22ba0 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22bb0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22bc0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22bd0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22be0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22bf0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22c00 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22c10 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c20 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c30 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
22c40 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22c50 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22c60 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22c70 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22c80 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22c90 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22cb0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22cc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22cd0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22ce0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22cf0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22d00 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22d10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d20 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d30 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22d40 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22d50 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22d60 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22d70 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22da0 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72 5c  ates %u as peer\
22db0 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29  n",pNew->selId))
22dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22dd0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22de0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
22df0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
22e00 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
22e10 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
22e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
22e30 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
22e40 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
22e50 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
22e60 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
22e70 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
22e80 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
22e90 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
22ea0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22eb0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
22ec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
22ed0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22ee0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
22ef0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22f00 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22f20 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22f30 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
22f40 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
22f50 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f60 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
22f70 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
22f80 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
22f90 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
22fa0 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
22fb0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
22fc0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
22fd0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22fe0 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
22ff0 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
23000 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
23010 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
23020 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
23030 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
23040 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
23050 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
23060 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
23070 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
23080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
23090 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
230a0 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
230b0 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
230c0 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
230d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
230e0 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
230f0 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
23100 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
23110 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
23120 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
23130 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
23140 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
23150 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23160 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23170 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23180 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
23190 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
231a0 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
231b0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
231c0 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
231d0 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
231e0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
231f0 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
23200 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
23210 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
23220 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23230 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
23240 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
23250 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
23260 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
23270 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
23280 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
23290 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
232a0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
232b0 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
232c0 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
232d0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
232e0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
232f0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
23300 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
23310 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
23320 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
23330 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
23340 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
23350 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
23360 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
23370 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
23380 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23390 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
233a0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
233b0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
233c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
233d0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
233e0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
233f0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
23400 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
23410 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
23420 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
23430 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
23440 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
23450 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
23460 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
23470 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
23480 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
23490 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
234a0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
234b0 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
234c0 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
234d0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
234e0 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
234f0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
23500 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
23510 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
23520 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
23530 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
23540 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
23550 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
23560 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
23570 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
23580 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23590 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
235a0 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
235b0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
235c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
235d0 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
235e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
235f0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
23600 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
23610 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23620 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
23630 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
23640 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23650 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
23660 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
23670 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
23680 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
23690 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
236a0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
236b0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
236c0 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
236d0 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
236e0 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
236f0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
23700 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73  /.      pSrc = s
23710 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
23720 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
23730 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
23740 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pSrc==0 ) break;
23750 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
23760 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
23770 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
23780 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
23790 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
237a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
237b0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
237c0 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
237d0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
237e0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
237f0 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
23800 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
23810 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
23820 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
23830 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
23840 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
23850 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
23860 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
23870 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
23880 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23890 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
238a0 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
238b0 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
238c0 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
238d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
238e0 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
238f0 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
23900 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
23910 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
23920 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
23930 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
23940 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
23950 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
23960 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
23970 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
23980 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
23990 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ry FROM clause t
239a0 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  o 4 slots..    *
239b0 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f  * The middle slo
239c0 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
239d0 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
239e0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
239f0 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  e.    ** for the
23a00 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
23a10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23a20 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
23a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23a40 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
23a50 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
23a60 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
23a70 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 6e  (pParse, pSrc, n
23a80 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
23a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
23aa0 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  c==0 ) break;.  
23ab0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
23ac0 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  c = pSrc;.    }.
23ad0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
23ae0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23af0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
23b00 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23b10 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
23b20 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
23b30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
23b40 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
23b50 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
23b60 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
23b70 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
23b80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23b90 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23ba0 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
23bb0 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
23bc0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
23bd0 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
23be0 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
23bf0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
23c00 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
23c10 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
23c20 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
23c30 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
23c40 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
23c50 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
23c60 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
23c70 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
23c80 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
23c90 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
23ca0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
23cb0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
23cc0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
23cd0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
23ce0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23cf0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
23d00 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
23d10 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
23d20 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
23d30 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
23d40 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
23d50 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
23d60 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
23d70 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
23d80 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
23d90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23da0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23db0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23dc0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23dd0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23df0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
23e00 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
23e10 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23e20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23e30 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
23e40 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
23e50 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
23e60 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
23e70 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
23e80 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23e90 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23ea0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23eb0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23ec0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23ed0 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23ee0 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23ef0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23f00 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
23f10 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
23f20 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
23f30 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
23f40 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
23f50 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
23f60 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
23f70 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
23f80 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
23f90 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23fa0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23fb0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
23fc0 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
23fd0 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
23fe0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
23ff0 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
24000 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
24010 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
24020 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24030 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
24040 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
24050 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
24060 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
24070 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
24080 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
24090 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
240a0 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
240b0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
240c0 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
240d0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
240e0 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
240f0 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
24100 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
24110 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
24120 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
24130 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
24140 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
24150 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
24160 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
24170 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24180 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
24190 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
241a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
241b0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
241c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
241d0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
241e0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
241f0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
24200 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
24210 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
24220 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24230 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
24240 20 70 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a 20   pSub->pWhere;. 
24250 20 20 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20     pSub->pWhere 
24260 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73 4c  = 0;.    if( isL
24270 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
24280 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
24290 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
242a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
242b0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
242c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
242d0 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
242e0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b  Parent->pWhere);
242f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
24300 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
24310 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
24320 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50  xt x;.      x.pP
24330 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
24340 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
24350 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  iParent;.      x
24360 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65  .iNewTable = iNe
24370 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  wParent;.      x
24380 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73  .isLeftJoin = is
24390 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  LeftJoin;.      
243a0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d  x.pEList = pSub-
243b0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  >pEList;.      s
243c0 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70  ubstSelect(&x, p
243d0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  Parent, 0);.    
243e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
243f0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
24400 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
24410 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
24420 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
24430 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
24440 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
24450 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
24460 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
24470 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
24480 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
24490 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
244a0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
244b0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
244c0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
244d0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
244e0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
244f0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
24500 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
24510 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
24520 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
24530 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
24540 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
24550 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
24560 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
24570 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
24580 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
24590 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
245a0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
245b0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
245c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
245d0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
245e0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
245f0 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
24600 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
24610 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
24620 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
24630 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
24640 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
24650 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
24660 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
24670 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
24680 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
24690 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
246a0 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
246b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
246c0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
246d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
246e0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
246f0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
24700 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
24710 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
24720 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
24730 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  W) */../*.** A s
24740 74 72 75 63 74 75 72 65 20 74 6f 20 6b 65 65 70  tructure to keep
24750 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66   track of all of
24760 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
24770 65 73 20 74 68 61 74 20 61 72 65 20 66 69 78 65  es that are fixe
24780 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20  d to.** a known 
24790 76 61 6c 75 65 20 64 75 65 20 74 6f 20 57 48 45  value due to WHE
247a0 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
247b0 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
247c0 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a  m COLUMN=VALUE..
247d0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
247e0 74 20 57 68 65 72 65 43 6f 6e 73 74 20 57 68 65  t WhereConst Whe
247f0 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20  reConst;.struct 
24800 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50  WhereConst {.  P
24810 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
24820 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24830 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  xt */.  int nCon
24840 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  st;      /* Numb
24850 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f  er for COLUMN=CO
24860 4e 53 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a  NSTANT terms */.
24870 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20    int nChng;    
24880 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24890 74 69 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  times a constant
248a0 20 69 73 20 70 72 6f 70 61 67 61 74 65 64 20 2a   is propagated *
248b0 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70 45 78 70  /.  Expr **apExp
248c0 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73  r;   /* [i*2] is
248d0 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32   COLUMN and [i*2
248e0 2b 31 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a  +1] is VALUE */.
248f0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  };../*.** Add a 
24900 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65  new entry to the
24910 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20   pConst object. 
24920 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
24930 61 64 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a  add duplicate.**
24940 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73   pColumn entires
24950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24960 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20   constInsert(.  
24970 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e  WhereConst *pCon
24980 73 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  st,      /* The 
24990 57 68 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20  WhereConst into 
249a0 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73  which we are ins
249b0 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72  erting */.  Expr
249c0 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20   *pColumn,      
249d0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55       /* The COLU
249e0 4d 4e 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  MN part of the c
249f0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45  onstraint */.  E
24a00 78 70 72 20 2a 70 56 61 6c 75 65 20 20 20 20 20  xpr *pValue     
24a10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
24a20 41 4c 55 45 20 70 61 72 74 20 6f 66 20 74 68 65  ALUE part of the
24a30 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
24a40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
24a50 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70  ert( pColumn->op
24a60 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a  ==TK_COLUMN );..
24a70 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35 20    /* 2018-10-25 
24a80 74 69 63 6b 65 74 20 5b 63 66 35 65 64 32 30 66  ticket [cf5ed20f
24a90 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ].  ** Make sure
24aa0 20 74 68 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d   the same pColum
24ab0 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65  n is not inserte
24ac0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
24ad0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
24ae0 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b  <pConst->nConst;
24af0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
24b00 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24b10 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a  Const->apExpr[i*
24b20 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
24b30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
24b40 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  LUMN );.    if( 
24b50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
24b60 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20  Column->iTable. 
24b70 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 43      && pExpr->iC
24b80 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e  olumn==pColumn->
24b90 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  iColumn.    ){. 
24ba0 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
24bb0 20 41 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   Already present
24bc0 2e 20 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  .  Return withou
24bd0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
24be0 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  . */.    }.  }..
24bf0 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74    pConst->nConst
24c00 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ++;.  pConst->ap
24c10 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62  Expr = sqlite3Db
24c20 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43  ReallocOrFree(pC
24c30 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62  onst->pParse->db
24c40 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  , pConst->apExpr
24c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24c60 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 73             pCons
24c70 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65  t->nConst*2*size
24c80 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20 20 69 66  of(Expr*));.  if
24c90 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  ( pConst->apExpr
24ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73  ==0 ){.    pCons
24cb0 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20  t->nConst = 0;. 
24cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
24cd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24ce0 70 56 61 6c 75 65 2c 20 45 50 5f 46 69 78 65 64  pValue, EP_Fixed
24cf0 43 6f 6c 29 20 29 20 70 56 61 6c 75 65 20 3d 20  Col) ) pValue = 
24d00 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20  pValue->pLeft;. 
24d10 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70     pConst->apExp
24d20 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  r[pConst->nConst
24d30 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b  *2-2] = pColumn;
24d40 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45  .    pConst->apE
24d50 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  xpr[pConst->nCon
24d60 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65  st*2-1] = pValue
24d70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
24d80 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  ind all terms of
24d90 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72   COLUMN=VALUE or
24da0 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e   VALUE=COLUMN in
24db0 20 70 45 78 70 72 20 77 68 65 72 65 20 56 41 4c   pExpr where VAL
24dc0 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74  UE.** is a const
24dd0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ant expression a
24de0 6e 64 20 77 68 65 72 65 20 74 68 65 20 74 65 72  nd where the ter
24df0 6d 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 62  m must be true b
24e00 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
24e10 70 61 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d  part of the AND-
24e20 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
24e30 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
24e40 6e 2e 20 20 46 6f 72 20 65 61 63 68 20 74 65 72  n.  For each ter
24e50 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20  m.** found, add 
24e60 69 74 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74  it to the pConst
24e70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
24e80 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43  tatic void findC
24e90 6f 6e 73 74 49 6e 57 68 65 72 65 28 57 68 65 72  onstInWhere(Wher
24ea0 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20  eConst *pConst, 
24eb0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
24ec0 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
24ed0 4c 65 66 74 3b 0a 20 20 69 66 28 20 70 45 78 70  Left;.  if( pExp
24ee0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
24ef0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
24f00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
24f10 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
24f20 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
24f30 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
24f40 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65    findConstInWhe
24f50 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72  re(pConst, pExpr
24f60 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66  ->pRight);.    f
24f70 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
24f80 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70  pConst, pExpr->p
24f90 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Left);.    retur
24fa0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  n;.  }.  if( pEx
24fb0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20  pr->op!=TK_EQ ) 
24fc0 72 65 74 75 72 6e 3b 0a 20 20 70 52 69 67 68 74  return;.  pRight
24fd0 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
24fe0 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  ;.  pLeft = pExp
24ff0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73 65  r->pLeft;.  asse
25000 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
25010 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
25020 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 69  !=0 );.  if( pRi
25030 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
25040 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  MN.   && !ExprHa
25050 73 50 72 6f 70 65 72 74 79 28 70 52 69 67 68 74  sProperty(pRight
25060 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20  , EP_FixedCol). 
25070 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
25080 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74  IsConstant(pLeft
25090 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49  ).   && sqlite3I
250a0 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42  sBinary(sqlite3B
250b0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
250c0 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Seq(pConst->pPar
250d0 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29  se,pLeft,pRight)
250e0 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
250f0 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70  Insert(pConst, p
25100 52 69 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20  Right, pLeft);. 
25110 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65   }else.  if( pLe
25120 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
25130 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  N.   && !ExprHas
25140 50 72 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20  Property(pLeft, 
25150 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20  EP_FixedCol).   
25160 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
25170 43 6f 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29  Constant(pRight)
25180 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73  .   && sqlite3Is
25190 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69  Binary(sqlite3Bi
251a0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
251b0 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73  eq(pConst->pPars
251c0 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29  e,pLeft,pRight))
251d0 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49  .  ){.    constI
251e0 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c  nsert(pConst, pL
251f0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
25200 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
25210 69 73 20 61 20 57 61 6c 6b 65 72 20 65 78 70 72  is a Walker expr
25220 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e  ession callback.
25230 20 20 70 45 78 70 72 20 69 73 20 61 20 63 61 6e    pExpr is a can
25240 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
25250 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  n.** to be repla
25260 63 65 64 20 62 79 20 61 20 76 61 6c 75 65 2e 20  ced by a value. 
25270 20 49 66 20 70 45 78 70 72 20 69 73 20 65 71 75   If pExpr is equ
25280 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f  ivalent to one o
25290 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  f the.** columns
252a0 20 6e 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65   named in pWalke
252b0 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65  r->u.pConst, the
252c0 6e 20 6f 76 65 72 77 72 69 74 65 20 69 74 20 77  n overwrite it w
252d0 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65  ith its.** corre
252e0 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a  sponding value..
252f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
25300 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45  opagateConstantE
25310 78 70 72 52 65 77 72 69 74 65 28 57 61 6c 6b 65  xprRewrite(Walke
25320 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
25330 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
25340 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20  i;.  WhereConst 
25350 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70  *pConst;.  if( p
25360 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
25370 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 52 43  UMN ) return WRC
25380 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
25390 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
253a0 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
253b0 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Col) ) return WR
253c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43  C_Continue;.  pC
253d0 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  onst = pWalker->
253e0 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28  u.pConst;.  for(
253f0 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e  i=0; i<pConst->n
25400 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Const; i++){.   
25410 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d   Expr *pColumn =
25420 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
25430 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  i*2];.    if( pC
25440 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63  olumn==pExpr ) c
25450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25460 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65   pColumn->iTable
25470 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  !=pExpr->iTable 
25480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25490 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f  if( pColumn->iCo
254a0 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn!=pExpr->iCo
254b0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
254c0 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74 63 68 20  .    /* A match 
254d0 69 73 20 66 6f 75 6e 64 2e 20 20 41 64 64 20 74  is found.  Add t
254e0 68 65 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 70  he EP_FixedCol p
254f0 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20 20 20 70  roperty */.    p
25500 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a  Const->nChng++;.
25510 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
25520 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25530 4c 65 61 66 29 3b 0a 20 20 20 20 45 78 70 72 53  Leaf);.    ExprS
25540 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
25550 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a  , EP_FixedCol);.
25560 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
25570 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
25580 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
25590 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
255a0 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d  (pConst->pParse-
255b0 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45  >db, pConst->apE
255c0 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a  xpr[i*2+1], 0);.
255d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
255e0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
255f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
25600 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e  WHERE-clause con
25610 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
25620 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  n optimization..
25630 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
25640 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
25650 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ns terms of the 
25660 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53  form COLUMN=CONS
25670 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54  TANT or.** CONST
25680 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20  ANT=COLUMN that 
25690 6d 75 73 74 20 62 65 20 74 72 65 65 20 28 69 6e  must be tree (in
256a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
256b0 20 74 68 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c   the terms top-l
256c0 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e  evel.** AND-conn
256d0 65 63 74 65 64 20 74 65 72 6d 73 20 74 68 61 74  ected terms that
256e0 20 61 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66   are not part of
256f0 20 61 20 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f   a ON clause fro
25700 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a  m a LEFT JOIN).*
25710 2a 20 74 68 65 6e 20 74 68 72 6f 75 67 68 6f 75  * then throughou
25720 74 20 74 68 65 20 71 75 65 72 79 20 72 65 70 6c  t the query repl
25730 61 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63  ace all other oc
25740 63 75 72 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c  currences of COL
25750 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53  UMN.** with CONS
25760 54 41 4e 54 20 77 69 74 68 69 6e 20 74 68 65 20  TANT within the 
25770 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
25780 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
25790 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
257a0 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  *      SELECT * 
257b0 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
257c0 57 48 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e  WHERE t1.a=39 AN
257d0 44 20 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20  D t2.b=t1.a AND 
257e0 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20  t3.c=t2.b.**.** 
257f0 49 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  Is transformed i
25800 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  nto.**.**      S
25810 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
25820 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 74 31   t2, t3 WHERE t1
25830 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33  .a=39 AND t2.b=3
25840 39 20 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a  9 AND t3.c=39.**
25850 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
25860 69 66 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d  if any transform
25870 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64  ations where mad
25880 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
25890 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ot..**.** Implem
258a0 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
258b0 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  Constant propaga
258c0 74 69 6f 6e 20 69 73 20 74 72 69 63 6b 79 20 64  tion is tricky d
258d0 75 65 20 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a  ue to affinity.*
258e0 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  * and collating 
258f0 73 65 71 75 65 6e 63 65 20 69 6e 74 65 72 61 63  sequence interac
25900 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72  tions.  Consider
25910 20 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a   this example:.*
25920 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54  *.**    CREATE T
25930 41 42 4c 45 20 74 31 28 61 20 49 4e 54 2c 62 20  ABLE t1(a INT,b 
25940 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53  TEXT);.**    INS
25950 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
25960 45 53 28 31 32 33 2c 27 30 31 32 33 27 29 3b 0a  ES(123,'0123');.
25970 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
25980 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
25990 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20  23 AND b=a;.**  
259a0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
259b0 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41  t1 WHERE a=123 A
259c0 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20  ND b=123;.**.** 
259d0 54 68 65 20 74 77 6f 20 53 45 4c 45 43 54 20 73  The two SELECT s
259e0 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20  tatements above 
259f0 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 64 69  should return di
25a00 66 66 65 72 65 6e 74 20 61 6e 73 77 65 72 73 2e  fferent answers.
25a10 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61    b=a.** is alwa
25a20 79 20 74 72 75 65 20 62 65 63 61 75 73 65 20 74  y true because t
25a30 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73  he comparison us
25a40 65 73 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  es numeric affin
25a50 69 74 79 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a  ity, but b=123.*
25a60 2a 20 69 73 20 66 61 6c 73 65 20 62 65 63 61 75  * is false becau
25a70 73 65 20 69 74 20 75 73 65 73 20 74 65 78 74 20  se it uses text 
25a80 61 66 66 69 6e 69 74 79 20 61 6e 64 20 27 30 31  affinity and '01
25a90 32 33 27 20 69 73 20 6e 6f 74 20 74 68 65 20 73  23' is not the s
25aa0 61 6d 65 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a  ame as '123'..**
25ab0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
25ac0 74 68 69 73 2c 20 74 68 65 20 65 78 70 72 65 73  this, the expres
25ad0 73 69 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f 74  sion tree is not
25ae0 20 61 63 74 75 61 6c 6c 79 20 63 68 61 6e 67 65   actually change
25af0 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20  d from.** "b=a" 
25b00 74 6f 20 22 62 3d 31 32 33 22 20 62 75 74 20 72  to "b=123" but r
25b10 61 74 68 65 72 20 74 68 65 20 22 61 22 20 69 6e  ather the "a" in
25b20 20 22 62 3d 61 22 20 69 73 20 74 61 67 67 65 64   "b=a" is tagged
25b30 20 77 69 74 68 20 45 50 5f 46 69 78 65 64 43 6f   with EP_FixedCo
25b40 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 22 31 32  l.** and the "12
25b50 33 22 20 76 61 6c 75 65 20 69 73 20 68 75 6e 67  3" value is hung
25b60 20 6f 66 66 20 6f 66 20 74 68 65 20 70 4c 65 66   off of the pLef
25b70 74 20 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65  t pointer.  Code
25b80 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f   generator.** ro
25b90 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67  utines know to g
25ba0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 6e 73  enerate the cons
25bb0 74 61 6e 74 20 22 31 32 33 22 20 69 6e 73 74 65  tant "123" inste
25bc0 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70  ad of looking up
25bd0 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76   the.** column v
25be0 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20  alue.  Also, to 
25bf0 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  avoid collation 
25c00 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f  problems, this o
25c10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a  ptimization is.*
25c20 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  * only attempted
25c30 20 69 66 20 74 68 65 20 22 61 3d 31 32 33 22 20   if the "a=123" 
25c40 74 65 72 6d 20 75 73 65 73 20 74 68 65 20 64 65  term uses the de
25c50 66 61 75 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c  fault BINARY col
25c60 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
25c70 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43  c int propagateC
25c80 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73  onstants(.  Pars
25c90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
25ca0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
25cb0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
25cc0 2a 70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p        /* The
25cd0 20 71 75 65 72 79 20 69 6e 20 77 68 69 63 68 20   query in which 
25ce0 74 6f 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e  to propagate con
25cf0 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57  stants */.){.  W
25d00 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57  hereConst x;.  W
25d10 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e  alker w;.  int n
25d20 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50  Chng = 0;.  x.pP
25d30 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
25d40 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73   do{.    x.nCons
25d50 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68  t = 0;.    x.nCh
25d60 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70  ng = 0;.    x.ap
25d70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69  Expr = 0;.    fi
25d80 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26  ndConstInWhere(&
25d90 78 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  x, p->pWhere);. 
25da0 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20     if( x.nConst 
25db0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
25dc0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
25dd0 29 3b 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73  );.      w.pPars
25de0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
25df0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
25e00 6b 20 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  k = propagateCon
25e10 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65  stantExprRewrite
25e20 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63  ;.      w.xSelec
25e30 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
25e40 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
25e50 70 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65  p;.      w.xSele
25e60 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
25e70 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44  .      w.walkerD
25e80 65 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  epth = 0;.      
25e90 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b  w.u.pConst = &x;
25ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25eb0 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d 3e 70 57  lkExpr(&w, p->pW
25ec0 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
25ed0 69 74 65 33 44 62 46 72 65 65 28 78 2e 70 50 61  ite3DbFree(x.pPa
25ee0 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70  rse->db, x.apExp
25ef0 72 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 20  r);.      nChng 
25f00 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20  += x.nChng;.    
25f10 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43  }.  }while( x.nC
25f20 68 6e 67 20 29 3b 20 20 0a 20 20 72 65 74 75 72  hng );  .  retur
25f30 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20  n nChng;.}..#if 
25f40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25f50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
25f60 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
25f70 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
25f80 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
25f90 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45  f relevant WHERE
25fa0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
25fb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
25fc0 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45   into.** the WHE
25fd0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62  RE clause of sub
25fe0 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a  query.  Example:
25ff0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
26000 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
26010 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
26020 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
26030 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
26040 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20  .** Transformed 
26050 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  into:.**.**    S
26060 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
26070 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
26080 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48   AS y FROM t1 WH
26090 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d  ERE a=5 AND c-d=
260a0 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45  10).**     WHERE
260b0 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
260c0 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73  *.** The hope is
260d0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
260e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e  added to the inn
260f0 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61  er query will ma
26100 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66  ke it more.** ef
26110 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44  ficient..**.** D
26120 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
26130 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
26140 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  if:.**.**   (1) 
26150 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69 63  (** This restric
26160 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64  tion was removed
26170 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20   on 2017-09-29. 
26180 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20   We used to.**  
26190 20 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f           disallo
261a0 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  w this optimizat
261b0 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74  ion for aggregat
261c0 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 62 75  e subqueries, bu
261d0 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t now.**        
261e0 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64     it is allowed
261f0 20 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20   by putting the 
26200 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
26210 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
26220 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54  ..**           T
26230 68 65 20 61 64 64 65 64 20 48 41 56 49 4e 47 20  he added HAVING 
26240 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c  clause is pointl
26250 65 73 73 20 69 66 20 74 68 65 20 73 75 62 71 75  ess if the subqu
26260 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20  ery lacks.**    
26270 20 20 20 20 20 20 20 61 20 47 52 4f 55 50 20 42         a GROUP B
26280 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73  Y clause.  But s
26290 75 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61  uch a HAVING cla
262a0 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d  use is also harm
262b0 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  less.**         
262c0 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20    so there does 
262d0 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65  not appear to be
262e0 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61   any reason to a
262f0 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a  dd extra logic.*
26300 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 73  *           to s
26310 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a  uppress it. **).
26320 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20  **.**   (2) The 
26330 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
26340 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
26350 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61  t of a common ta
26360 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ble expression..
26370 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20  **.**   (3) The 
26380 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20  inner query has 
26390 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28  a LIMIT clause (
263a0 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65  since the change
263b0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  s to the WHERE.*
263c0 2a 20 20 20 20 20 20 20 63 6c 61 75 73 65 20 77  *       clause w
263d0 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
263e0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c  meaning of the L
263f0 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  IMIT)..**.**   (
26400 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  4) The inner que
26410 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
26420 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
26430 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a  T JOIN and the.*
26440 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73 69  *       expressi
26450 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  on to be pushed 
26460 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  down does not co
26470 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  me from the ON c
26480 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
26490 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e  n that LEFT JOIN
264a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ..**.**   (5) Th
264b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
264c0 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
264d0 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
264e0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
264f0 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
26500 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75  T JOIN where iCu
26510 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20  rsor is not the 
26520 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65  right-hand table
26530 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20   of that.**     
26540 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e    left join.  An
26550 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
26560 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
26570 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   *.**           
26580 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41  FROM (SELECT 1 A
26590 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S a1 UNION ALL S
265a0 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a  ELECT 2) AS aa.*
265b0 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e  *           JOIN
265c0 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62 32   (SELECT 1 AS b2
265d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
265e0 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61  T 2) AS bb ON (a
265f0 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  1=b2).**        
26600 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45     LEFT JOIN (SE
26610 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e 49  LECT 8 AS c3 UNI
26620 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29  ON ALL SELECT 9)
26630 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29   AS cc ON (b2=2)
26640 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68  ;.**.**       Th
26650 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
26660 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20   is three rows: 
26670 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32   (1,1,NULL),(2,2
26680 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20  ,8),(2,2,9)..** 
26690 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68 65        But if the
266a0 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72   (b2=2) term wer
266b0 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64  e to be pushed d
266c0 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20  own into the bb 
266d0 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20  subquery,.**    
266e0 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31     then the (1,1
266f0 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64  ,NULL) row would
26700 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a   be suppressed..
26710 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68 65 20  **.**   (6) The 
26720 69 6e 6e 65 72 20 71 75 65 72 79 20 66 65 61 74  inner query feat
26730 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ures one or more
26740 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
26750 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20  s (since .**    
26760 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68     changes to th
26770 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
26780 66 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  f the inner quer
26790 79 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  y could change t
267a0 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e  he .**       win
267b0 64 6f 77 20 6f 76 65 72 20 77 68 69 63 68 20 77  dow over which w
267c0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
267d0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 29 2e  are calculated).
267e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
267f0 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  if no changes ar
26800 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a  e made and non-z
26810 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ero if one or mo
26820 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  re WHERE clause.
26830 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  ** terms are dup
26840 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65  licated into the
26850 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
26860 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77  atic int pushDow
26870 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50  nWhereTerms(.  P
26880 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
26890 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
268a0 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f  ntext (for mallo
268b0 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65  c() and error re
268c0 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65  porting) */.  Se
268d0 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20  lect *pSubq,    
268e0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
268f0 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20  ery whose WHERE 
26900 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20  clause is to be 
26910 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45  augmented */.  E
26920 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
26930 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
26940 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
26950 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
26960 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20   int iCursor,   
26970 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
26980 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73   number of the s
26990 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
269a0 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20   isLeftJoin     
269b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53     /* True if pS
269c0 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68 74  ubq is the right
269d0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
269e0 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  JOIN */.){.  Exp
269f0 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
26a00 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Chng = 0;.  if( 
26a10 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
26a20 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62  rn 0;.  if( pSub
26a30 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  q->selFlags & SF
26a40 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74  _Recursive ) ret
26a50 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72  urn 0;  /* restr
26a60 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23  iction (2) */..#
26a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26a80 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
26a90 69 66 28 20 70 53 75 62 71 2d 3e 70 57 69 6e 20  if( pSubq->pWin 
26aa0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
26ab0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * restriction (6
26ac0 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ) */.#endif..#if
26ad0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
26ae0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66  .  /* Only the f
26af0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  irst term of a c
26b00 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65  ompound can have
26b10 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20   a WITH clause. 
26b20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73   But make.  ** s
26b30 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72  ure no other ter
26b40 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46  ms are marked SF
26b50 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20 63 61  _Recursive in ca
26b60 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61  se something cha
26b70 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nges.  ** in the
26b80 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20   future..  */.  
26b90 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58  {.    Select *pX
26ba0 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70  ;  .    for(pX=p
26bb0 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d  Subq; pX; pX=pX-
26bc0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
26bd0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c  assert( (pX->sel
26be0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
26bf0 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20  rsive))==0 );.  
26c00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
26c10 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69    if( pSubq->pLi
26c20 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  mit!=0 ){.    re
26c30 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
26c40 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20  iction (3) */.  
26c50 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  }.  while( pWher
26c60 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
26c70 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75  .    nChng += pu
26c80 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
26c90 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20  (pParse, pSubq, 
26ca0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a  pWhere->pRight,.
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a  iCursor, isLeftJ
26ce0 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65  oin);.    pWhere
26cf0 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74   = pWhere->pLeft
26d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65  ;.  }.  if( isLe
26d10 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78  ftJoin.   && (Ex
26d20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
26d30 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  here,EP_FromJoin
26d40 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  )==0.         ||
26d50 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a   pWhere->iRightJ
26d60 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f  oinTable!=iCurso
26d70 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  r).  ){.    retu
26d80 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
26d90 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a  tion (4) */.  }.
26da0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
26db0 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
26dc0 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68  FromJoin) && pWh
26dd0 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
26de0 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b  able!=iCursor ){
26df0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
26e00 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * restriction (5
26e10 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73  ) */.  }.  if( s
26e20 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
26e30 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  eConstant(pWhere
26e40 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  , iCursor) ){.  
26e50 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77    nChng++;.    w
26e60 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20  hile( pSubq ){. 
26e70 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
26e80 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  t x;.      pNew 
26e90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
26ea0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68  (pParse->db, pWh
26eb0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75  ere, 0);.      u
26ec0 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65  nsetJoinExpr(pNe
26ed0 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e  w, -1);.      x.
26ee0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
26ef0 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
26f00 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
26f10 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
26f20 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
26f30 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a  isLeftJoin = 0;.
26f40 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d        x.pEList =
26f50 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a   pSubq->pEList;.
26f60 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
26f70 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29  stExpr(&x, pNew)
26f80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62  ;.      if( pSub
26f90 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  q->selFlags & SF
26fa0 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
26fb0 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61        pSubq->pHa
26fc0 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
26fd0 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53  prAnd(pParse, pS
26fe0 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e  ubq->pHaving, pN
26ff0 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ew);.      }else
27000 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d  {.        pSubq-
27010 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
27020 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c  3ExprAnd(pParse,
27030 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
27040 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
27050 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
27060 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
27070 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
27080 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
27090 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
270a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
270b0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
270c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
270d0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75  /../*.** The pFu
270e0 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  nc is the only a
270f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27100 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  n in the query. 
27110 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a   Check to see.**
27120 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
27130 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
27140 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
27150 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  imization. .**.*
27160 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
27170 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
27180 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
27190 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
271a0 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61   set.** *ppMinMa
271b0 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52  x to be an ORDER
271c0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
271d0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70   used for the op
271e0 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  timization.** an
271f0 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20  d return either 
27200 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
27210 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
27220 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67  BY_MAX depending
27230 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70   on.** whether p
27240 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20  Func is a min() 
27250 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
27260 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
27270 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
27280 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
27290 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
272a0 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a  ation, return.**
272b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
272c0 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73  ORMAL (which mus
272d0 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a  t be zero)..**.*
272e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
272f0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
27300 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75  ter aggregate fu
27310 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
27320 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74  n.** located but
27330 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72   before their ar
27340 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  guments have bee
27350 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61  n subjected to a
27360 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c  ggregate.** anal
27370 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ysis..*/.static 
27380 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73  u8 minMaxQuery(s
27390 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
273a0 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73   *pFunc, ExprLis
273b0 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
273c0 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
273d0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
273e0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
273f0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72   value */.  Expr
27400 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
27410 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Func->x.pList;  
27420 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
27430 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
27440 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27450 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  zFunc;          
27460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
27470 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
27480 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f  unction pFunc */
27490 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
274a0 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74  derBy;.  u8 sort
274b0 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Order;..  assert
274c0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29  ( *ppMinMax==0 )
274d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
274e0 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  c->op==TK_AGG_FU
274f0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
27500 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
27510 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
27520 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a  return eRet;.  z
27530 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
27540 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
27550 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
27560 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
27570 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
27580 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
27590 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
275a0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
275b0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
275c0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
275d0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
275e0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
275f0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
27600 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
27610 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
27620 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
27630 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
27640 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
27650 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
27660 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
27670 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
27680 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
27690 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
276a0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
276b0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
276c0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
276d0 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
276e0 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
276f0 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
27700 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
27710 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
27720 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
27730 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
27740 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27750 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
27760 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
27770 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
27780 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
27790 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
277a0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
277b0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
277c0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
277d0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
277e0 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
277f0 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
27800 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
27810 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
27820 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
27830 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
27840 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
27850 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
27860 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
27870 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
27880 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
27890 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
278a0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
278b0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
278c0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
278d0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
278e0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
278f0 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
27900 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
27910 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
27920 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
27930 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
27940 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
27950 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
27960 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
27970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27980 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
27990 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
279a0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
279b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
279c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
279d0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
279e0 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
279f0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
27a00 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
27a10 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
27a20 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
27a30 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
27a40 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
27a50 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
27a60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27a70 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
27a80 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
27a90 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
27aa0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
27ab0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
27ac0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
27ad0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
27ae0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
27af0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
27b00 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
27b10 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
27b20 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
27b30 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
27b40 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
27b50 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
27b60 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
27b70 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
27b80 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
27b90 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
27ba0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
27bb0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
27bc0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
27bd0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
27be0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
27bf0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
27c00 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
27c10 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
27c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c30 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
27c40 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
27c50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
27c60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27c70 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
27c80 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
27c90 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
27ca0 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
27cb0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
27cc0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
27cd0 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
27ce0 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
27cf0 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
27d00 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
27d10 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
27d20 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
27d30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
27d40 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
27d50 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
27d60 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
27d70 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
27d80 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
27d90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27da0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
27db0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
27dc0 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
27dd0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
27de0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
27df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27e00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
27e10 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
27e20 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
27e30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27e40 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
27e50 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
27e60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
27e70 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
27e80 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
27e90 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
27ea0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
27eb0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
27ec0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27ed0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
27ee0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
27ef0 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
27f00 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
27f10 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
27f20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
27f30 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
27f40 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
27f50 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
27f60 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27f70 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
27f80 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
27f90 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
27fa0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
27fb0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
27fc0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
27fd0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
27fe0 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
27ff0 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
28000 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
28010 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
28020 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
28030 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
28040 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
28050 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
28060 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
28070 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
28080 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
28090 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
280a0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
280b0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
280c0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
280d0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
280e0 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
280f0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
28100 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
28110 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
28120 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
28130 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
28140 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
28150 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
28160 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
28170 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
28180 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
28190 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
281a0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
281b0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
281c0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
281d0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
281e0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
281f0 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
28200 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
28210 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
28220 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
28230 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
28240 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
28250 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
28260 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
28270 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
28280 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
28290 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
282a0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
282b0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
282c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
282d0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
282e0 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
282f0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
28300 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
28310 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
28320 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
28330 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
28340 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
28350 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
28360 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
28370 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
28380 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
28390 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
283a0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
283b0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
283c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
283d0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
283e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
283f0 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
28400 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
28410 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
28420 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
28430 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
28440 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
28450 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
28460 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
28470 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
28480 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
28490 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
284a0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
284b0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
284c0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
284d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
284e0 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
284f0 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
28500 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
28510 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
28520 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28530 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
28540 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
28550 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
28560 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
28570 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
28580 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
28590 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
285a0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
285b0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
285c0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
285d0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
285e0 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
285f0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
28600 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
28610 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
28620 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
28630 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
28640 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
28650 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
28660 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
28670 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
28680 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
28690 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
286a0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
286b0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
286c0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
286d0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
286e0 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
286f0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
28700 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
28710 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
28720 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e if the FROM cl
28730 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20  ause term pFrom 
28740 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  has table-valued
28750 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67   function.** arg
28760 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64  uments.  If it d
28770 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  oes, leave an er
28780 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
28790 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
287a0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69  .** non-zero, si
287b0 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74  nce pFrom is not
287c0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
287d0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
287e0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
287f0 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75  c int cannotBeFu
28800 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
28810 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
28820 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
28830 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
28840 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
28850 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28860 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73  Msg(pParse, "'%s
28870 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
28880 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61  ion", pFrom->zNa
28890 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
288a0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
288b0 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
288c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
288d0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
288e0 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
288f0 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
28900 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
28910 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
28920 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
28930 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
28940 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
28950 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
28960 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
28970 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
28980 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
28990 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
289a0 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
289b0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
289c0 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
289d0 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
289e0 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
289f0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
28a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
28a10 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
28a20 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
28a30 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
28a40 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
28a50 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
28a60 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
28a70 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
28a80 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
28a90 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
28aa0 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ac0 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
28ad0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
28ae0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
28af0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
28b00 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
28b10 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
28b20 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
28b30 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
28b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28b50 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
28b60 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
28b70 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
28b80 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
28b90 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
28ba0 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
28bb0 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
28bc0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
28bd0 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
28be0 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
28bf0 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
28c00 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
28c10 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
28c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
28c30 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
28c40 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
28c50 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
28c60 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
28c70 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
28c80 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
28c90 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
28ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
28cb0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
28cc0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
28cd0 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
28ce0 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
28cf0 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
28d00 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
28d10 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
28d20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
28d30 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
28d40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28d50 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
28d60 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
28d70 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28d80 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
28d90 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
28da0 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
28db0 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
28dc0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
28dd0 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
28de0 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
28df0 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
28e00 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
28e10 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
28e20 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
28e30 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
28e40 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
28e50 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
28e60 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
28e70 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
28e80 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
28e90 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
28ea0 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
28eb0 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
28ec0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
28ed0 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
28ee0 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
28ef0 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
28f00 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
28f10 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
28f20 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
28f30 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
28f40 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
28f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28f60 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
28f70 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
28f80 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
28f90 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
28fa0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
28fb0 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
28fc0 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
28fd0 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
28fe0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
28ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
29000 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
29010 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
29020 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
29030 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
29040 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
29050 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
29060 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
29070 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
29080 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
29090 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
290a0 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
290b0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
290c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
290d0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
290e0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
290f0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
29100 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
29110 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
29120 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
29130 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
29140 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
29150 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
29160 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
29170 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
29180 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
29190 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
291a0 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
291b0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
291c0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
291d0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
291e0 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
291f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
29200 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
29210 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
29220 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
29230 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
29240 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
29250 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
29260 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
29270 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
29280 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29290 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
292a0 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
292b0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
292c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
292d0 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
292e0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
292f0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
29300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29310 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
29320 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
29330 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
29340 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
29350 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
29360 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
29390 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
293a0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
293b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
293c0 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
293d0 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
293e0 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
293f0 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
29400 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
29410 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
29420 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
29430 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
29440 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
29450 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
29460 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
29470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29480 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
29490 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
294a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
294b0 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
294c0 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
294d0 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
294e0 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
294f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
29500 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
29510 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
29520 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
29530 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
29540 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
29550 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
29560 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
29570 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
29580 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
29590 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
295a0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
295b0 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
295c0 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
295d0 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
295e0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
295f0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
29600 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
29610 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
29620 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
29630 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
29640 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29650 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
29660 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
29670 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
29680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29690 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
296a0 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  ( cannotBeFuncti
296b0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
296c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
296d0 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73  E_ERROR;..    as
296e0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
296f0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
29700 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
29710 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
29720 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
29730 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
29740 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
29750 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
29760 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
29770 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
29780 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
29790 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
297a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
297b0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
297c0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
297d0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
297e0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
297f0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
29800 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
29810 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
29820 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
29830 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
29840 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
29850 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
29860 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
29870 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
29880 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
298a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
298b0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
298c0 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
298d0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
298e0 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
298f0 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
29900 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
29910 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
29920 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
29930 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
29940 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
29950 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
29960 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
29970 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
29980 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
29990 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
299a0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
299b0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
299c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
299d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
299e0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
299f0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
29a00 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
29a10 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
29a20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
29a30 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
29a40 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
29a50 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
29a60 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
29a70 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
29a80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
29a90 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
29aa0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
29ab0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
29ac0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
29ad0 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
29ae0 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
29af0 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
29b00 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
29b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29b20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
29b30 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
29b40 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
29b50 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
29b60 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20  >nTabRef>2 ){.  
29b70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29b80 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
29b90 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
29ba0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
29bb0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
29bc0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
29bd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
29be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29bf0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
29c00 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61  ssert( pTab->nTa
29c10 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20  bRef==1 || .    
29c20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e          ((pSel->
29c30 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
29c40 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
29c50 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  nTabRef==2 ));..
29c60 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
29c70 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
29c80 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
29c90 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
29ca0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
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 20 20 20 20 69 66 28  = pWith;.    if(
29cd0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
29ce0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
29cf0 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70  pPrior = pSel->p
29d00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73  Prior;.      ass
29d10 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69  ert( pPrior->pWi
29d20 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  th==0 );.      p
29d30 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70  Prior->pWith = p
29d40 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  Sel->pWith;.    
29d50 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29d60 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72  ect(pWalker, pPr
29d70 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69  ior);.      pPri
29d80 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  or->pWith = 0;. 
29d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29da0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29db0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
29dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
29dd0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
29de0 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
29df0 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
29e00 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
29e10 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
29e20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
29e30 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
29e40 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
29e50 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
29e60 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
29e70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
29e80 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
29e90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
29ea0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
29eb0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
29ec0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
29ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
29ee0 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
29ef0 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
29f00 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
29f10 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29f20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29f30 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
29f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29f50 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
29f60 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
29f70 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
29f80 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
29f90 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
29fa0 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
29fb0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
29fc0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
29fd0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
29fe0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
29ff0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
2a000 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
2a010 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
2a020 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
2a030 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
2a040 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
2a050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a060 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
2a070 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
2a080 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
2a090 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
2a0a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a0b0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
2a0c0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
2a0d0 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
2a0e0 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
2a0f0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
2a100 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
2a110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a120 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
2a130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a140 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
2a150 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
2a160 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2a170 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
2a180 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
2a190 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
2a1a0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
2a1b0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2a1c0 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
2a1d0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
2a1e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2a1f0 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
2a200 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
2a210 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
2a220 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
2a230 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
2a240 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
2a250 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
2a260 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
2a270 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
2a280 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
2a290 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
2a2a0 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
2a2b0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
2a2c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2a2d0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2a2e0 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
2a2f0 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
2a300 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70  ->pWith) && p->p
2a310 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
2a320 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
2a330 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
2a340 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70  pWith;.    if( p
2a350 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20  With!=0 ){.     
2a360 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2a370 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
2a380 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70  .      pParse->p
2a390 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f  With = pWith->pO
2a3a0 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uter;.    }.  }.
2a3b0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
2a3c0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
2a3d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2a3e0 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73  e SrcList_item s
2a3f0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2a400 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2a410 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74  gument represent
2a420 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79  s a.** sub-query
2a430 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a440 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
2a450 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
2a460 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
2a470 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61  cates and popula
2a480 74 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f  tes the SrcList_
2a490 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74  item.pTab object
2a4a0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2a4b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2a4c0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
2a4d0 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20  wise, if an OOM 
2a4e0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
2a4f0 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ered,.** SQLITE_
2a500 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  NOMEM..*/.int sq
2a510 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
2a520 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
2a530 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
2a540 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
2a550 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
2a560 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
2a570 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2a580 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20  .  assert( pSel 
2a590 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  );.  pFrom->pTab
2a5a0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
2a5b0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
2a5c0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
2a5d0 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
2a5e0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
2a5f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a600 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
2a610 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d   1;.  if( pFrom-
2a620 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >zAlias ){.    p
2a630 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
2a640 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
2a650 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e  rse->db, pFrom->
2a660 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65  zAlias);.  }else
2a670 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  {.    pTab->zNam
2a680 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
2a690 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
2a6a0 73 75 62 71 75 65 72 79 5f 25 75 22 2c 20 70 53  subquery_%u", pS
2a6b0 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a  el->selId);.  }.
2a6c0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
2a6d0 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
2a6e0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
2a6f0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
2a700 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2a710 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
2a720 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70  t,&pTab->nCol,&p
2a730 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  Tab->aCol);.  pT
2a740 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
2a750 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
2a760 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
2a770 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
2a780 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
2a790 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
2a7a0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
2a7b0 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l;..  return pPa
2a7c0 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49  rse->nErr ? SQLI
2a7d0 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54  TE_ERROR : SQLIT
2a7e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a7f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2a800 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
2a810 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
2a820 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2a830 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
2a840 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
2a850 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2a860 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
2a870 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
2a880 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
2a890 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
2a8a0 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
2a8b0 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
2a8c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
2a8d0 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
2a8e0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
2a8f0 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
2a900 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
2a910 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
2a920 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
2a930 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
2a940 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
2a950 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
2a960 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
2a970 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
2a980 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
2a990 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
2a9a0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
2a9b0 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
2a9c0 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
2a9d0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
2a9e0 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
2a9f0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
2aa00 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
2aa10 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
2aa20 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
2aa30 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
2aa40 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
2aa50 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
2aa60 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
2aa70 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
2aa80 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
2aa90 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
2aaa0 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
2aab0 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
2aac0 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
2aad0 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
2aae0 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
2aaf0 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
2ab00 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
2ab10 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
2ab20 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
2ab30 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
2ab40 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
2ab50 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
2ab60 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
2ab70 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
2ab80 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
2ab90 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
2aba0 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
2abb0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
2abc0 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
2abd0 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
2abe0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2abf0 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
2ac00 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
2ac10 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
2ac20 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
2ac30 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
2ac40 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
2ac50 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
2ac60 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2ac70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2ac80 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2ac90 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
2aca0 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
2acb0 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
2acc0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
2acd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ace0 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
2acf0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2ad00 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
2ad10 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
2ad20 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
2ad30 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
2ad40 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67  .  u32 elistFlag
2ad50 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c  s = 0;..  p->sel
2ad60 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
2ad70 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
2ad80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
2ad90 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2ada0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73  Abort;.  }.  ass
2adb0 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
2adc0 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61  );.  if( (selFla
2add0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
2ade0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
2adf0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2ae00 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
2ae10 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
2ae20 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
2ae30 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
2ae40 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
2ae50 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  , 0);..  /* Make
2ae60 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
2ae70 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
2ae80 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
2ae90 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
2aea0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2aeb0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2aec0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
2aed0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
2aee0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
2aef0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
2af00 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
2af10 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
2af20 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2af30 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
2af40 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
2af50 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
2af60 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
2af70 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
2af80 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
2af90 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
2afa0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
2afb0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
2afc0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
2afd0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
2afe0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
2aff0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
2b000 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2b010 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
2b020 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
2b030 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
2b040 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
2b050 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
2b060 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
2b070 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
2b080 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
2b090 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b0a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
2b0b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b0c0 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
2b0d0 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
2b0e0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
2b0f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2b100 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
2b110 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
2b120 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2b130 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
2b140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b150 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
2b160 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
2b170 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2b180 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
2b190 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2b1a0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2b1b0 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
2b1c0 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
2b1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2b1e0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
2b1f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2b200 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2b210 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
2b220 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b230 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2b240 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
2b250 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
2b260 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b270 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2b280 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
2b290 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
2b2a0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
2b2b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2b2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
2b2d0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
2b2e0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
2b2f0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
2b300 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
2b310 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
2b320 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
2b330 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2b340 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2b350 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
2b360 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
2b370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2b380 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
2b390 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
2b3a0 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
2b3b0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
2b3c0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2b3d0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
2b3e0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
2b3f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2b400 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
2b410 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
2b420 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
2b430 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b440 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
2b450 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
2b460 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
2b470 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b480 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
2b490 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b4a0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
2b4b0 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
2b4c0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
2b4d0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2b4e0 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
2b4f0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2b500 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
2b510 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b520 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
2b530 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
2b540 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
2b550 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
2b560 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
2b570 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
2b580 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
2b590 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
2b5a0 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
2b5b0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
2b5c0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
2b5d0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
2b5e0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
2b5f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2b600 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2b610 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
2b620 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
2b630 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
2b640 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2b650 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
2b660 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
2b670 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
2b680 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
2b690 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
2b6a0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
2b6b0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
2b6c0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
2b6d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b6e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b6f0 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
2b700 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
2b710 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2b720 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
2b730 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
2b740 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
2b750 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
2b760 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
2b770 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b780 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
2b790 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
2b7a0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
2b7b0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
2b7c0 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
2b7d0 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
2b7e0 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
2b7f0 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
2b800 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
2b810 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
2b820 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
2b830 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
2b840 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
2b850 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
2b860 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
2b870 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
2b880 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
2b890 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
2b8a0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
2b8b0 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
2b8c0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
2b8d0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
2b8e0 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
2b8f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
2b900 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
2b910 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
2b920 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
2b930 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
2b940 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
2b950 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
2b960 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2b970 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
2b980 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
2b990 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
2b9a0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
2b9b0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
2b9c0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
2b9d0 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
2b9e0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
2b9f0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
2ba00 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
2ba10 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2ba20 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
2ba30 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
2ba40 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2ba50 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
2ba60 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
2ba70 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
2ba80 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
2ba90 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
2baa0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
2bab0 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
2bac0 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c  eak;.    elistFl
2bad0 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
2bae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
2baf0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2bb00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
2bb10 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
2bb20 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
2bb30 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
2bb40 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
2bb50 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
2bb60 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
2bb70 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
2bb80 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
2bb90 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
2bba0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2bbb0 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
2bbc0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
2bbd0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
2bbe0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
2bbf0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
2bc00 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
2bc10 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
2bc20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
2bc30 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
2bc40 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
2bc50 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
2bc60 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc80 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
2bc90 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
2bca0 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
2bcb0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
2bcc0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
2bcd0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
2bce0 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c  r;.      elistFl
2bcf0 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
2bd00 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
2bd10 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
2bd20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2bd30 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
2bd40 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
2bd50 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
2bd60 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26  STERISK.       &
2bd70 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
2bd80 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
2bd90 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20  =TK_ASTERISK).  
2bda0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2bdb0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
2bdc0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
2bdd0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2bde0 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
2bdf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
2be00 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2be10 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2be20 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
2be30 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
2be40 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2be50 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
2be60 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
2be70 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
2be80 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
2be90 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
2bea0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
2beb0 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
2bec0 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
2bed0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
2bee0 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
2bef0 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
2bf00 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
2bf10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2bf20 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
2bf30 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
2bf40 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
2bf50 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
2bf60 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
2bf70 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
2bf80 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
2bf90 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
2bfa0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
2bfb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
2bfc0 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
2bfd0 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
2bfe0 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
2bff0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2c000 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
2c010 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c020 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
2c030 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c040 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2c050 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
2c060 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2c070 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
2c080 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
2c090 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
2c0a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
2c0b0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
2c0c0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
2c0d0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
2c0e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
2c0f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
2c100 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
2c110 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2c120 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2c130 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
2c140 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
2c150 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
2c160 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2c170 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
2c180 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2c190 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
2c1a0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
2c1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c1c0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
2c1d0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2c1e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2c1f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2c200 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
2c210 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
2c220 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
2c230 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
2c240 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
2c250 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
2c260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2c270 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
2c280 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
2c290 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
2c2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c2b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c2d0 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
2c2e0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2c2f0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2c300 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
2c310 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
2c320 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
2c330 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22  Db].zDbSName : "
2c340 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
2c350 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2c360 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
2c370 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2c380 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2c390 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
2c3a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2c3b0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
2c3c0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
2c3d0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
2c3e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
2c3f0 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
2c400 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
2c410 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
2c420 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
2c430 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
2c440 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
2c450 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
2c460 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
2c470 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2c480 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
2c490 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2c4a0 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
2c4b0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2c4c0 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
2c4d0 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
2c4e0 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
2c4f0 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
2c500 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2c510 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c520 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2c530 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
2c540 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
2c550 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
2c560 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d  n', omit it from
2c570 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
2c580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
2c590 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c  ult-set list unl
2c5a0 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68  ess the SELECT h
2c5b0 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64  as the SF_Includ
2c5c0 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20  eHidden.        
2c5d0 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a      ** bit set..
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2c5f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2c600 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c610 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d  _IncludeHidden)=
2c620 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2c630 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  && IsHiddenColum
2c640 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
2c650 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
2c660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c670 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c690 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
2c6a0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
2c6b0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
2c6c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c6d0 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
2c6e0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
2c6f0 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2c710 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
2c720 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
2c730 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
2c750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c760 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
2c770 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
2c780 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
2c790 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
2c7a0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
2c7b0 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
2c7c0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c7e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c800 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
2c810 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
2c820 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
2c830 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2c840 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
2c850 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
2c860 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
2c870 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2c890 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
2c8a0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
2c8b0 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c8d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c8f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c900 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
2c910 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2c920 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2c930 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2c940 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2c950 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
2c960 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c970 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
2c980 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
2c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
2c9a0 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
2c9b0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2c9c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2c9d0 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
2c9e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2c9f0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2ca00 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2ca10 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
2ca20 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
2ca30 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
2ca40 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2ca50 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
2ca60 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2ca70 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
2ca80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2ca90 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2caa0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2cab0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
2cac0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2cad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cae0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
2caf0 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
2cb00 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
2cb10 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2cb20 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
2cb30 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
2cb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cb50 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
2cb60 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2cb70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2cb90 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
2cba0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
2cbb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cbc0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2cbd0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2cbe0 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
2cbf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2cc00 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
2cc10 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e  &sColname, zColn
2cc20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2cc30 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2cc40 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
2cc50 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
2cc60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2cc70 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
2cc80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2cc90 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2cca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ccb0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2ccc0 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
2ccd0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2cce0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
2ccf0 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2cd10 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
2cd20 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
2cd30 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2cd40 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
2cd50 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2cd60 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
2cd70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cd80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2cd90 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
2cda0 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
2cdb0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
2cdc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
2cdf0 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
2ce00 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2ce30 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2ce40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ce50 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
2ce60 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
2ce70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ce80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ce90 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
2cea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ceb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cec0 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
2ced0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cee0 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
2cef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2cf00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2cf10 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
2cf20 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
2cf30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cf40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cf50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2cf60 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
2cf70 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
2cf80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cf90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2cfa0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2cfb0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
2cfc0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
2cfd0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
2cfe0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b  if( p->pEList ){
2cff0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
2d000 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
2d010 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2d020 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
2d030 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d040 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2d050 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
2d060 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
2d070 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2d080 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
2d090 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20  if( (elistFlags 
2d0a0 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50  & (EP_HasFunc|EP
2d0b0 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29  _Subquery))!=0 )
2d0c0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
2d0d0 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65  ags |= SF_Comple
2d0e0 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20  xResult;.    }. 
2d0f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2d100 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2d110 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2d120 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2d130 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
2d140 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
2d150 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
2d160 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2d170 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
2d180 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
2d190 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
2d1a0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
2d1b0 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
2d1c0 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
2d1d0 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2d1e0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2d1f0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2d200 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
2d210 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2d220 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
2d230 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
2d240 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
2d250 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
2d260 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
2d270 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2d280 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
2d290 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
2d2a0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2d2b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2d2c0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2d2d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
2d2e0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2d2f0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2d300 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2d310 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53  ree walker for S
2d320 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2d330 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e  ..** subquery in
2d340 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2d350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d360 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57  SelectWalkNoop(W
2d370 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d380 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d390 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d3a0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d3b0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
2d3c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d3d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2d3e0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61  DEBUG./*.** Alwa
2d3f0 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73  ys assert.  This
2d400 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2d410 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  2 implementation
2d420 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65   proves that the
2d430 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  .** xSelectCallb
2d440 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e  ack2 is never in
2d450 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  voked..*/.void s
2d460 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2d470 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a  Assert2(Walker *
2d480 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
2d490 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2d4a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2d4b0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2d4c0 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20  2);.  assert( 0 
2d4d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  );.}.#endif./*.*
2d4e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
2d4f0 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
2d500 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
2d510 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
2d520 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
2d530 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2d540 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
2d550 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
2d560 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
2d570 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
2d580 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
2d590 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
2d5a0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
2d5b0 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
2d5c0 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
2d5d0 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
2d5e0 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
2d5f0 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
2d600 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
2d610 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2d620 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
2d630 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
2d640 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
2d650 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
2d660 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
2d670 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
2d680 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2d690 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
2d6a0 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
2d6b0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
2d6c0 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
2d6d0 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
2d6e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
2d6f0 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
2d700 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d720 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d730 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
2d740 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
2d750 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
2d760 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d770 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2d780 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2d790 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2d7a0 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
2d7b0 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
2d7c0 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a  hasCompound) ){.
2d7d0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d7e0 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
2d7f0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
2d800 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78  ubquery;.    w.x
2d810 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d820 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2d830 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2d840 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
2d850 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d860 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
2d870 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
2d880 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
2d890 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74  PopWith;.  sqlit
2d8a0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2d8b0 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
2d8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d8d0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2d8e0 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
2d8f0 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
2d900 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
2d910 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
2d920 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
2d930 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
2d940 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
2d950 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
2d960 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
2d970 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
2d980 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2d990 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
2d9a0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2d9b0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2d9c0 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
2d9d0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
2d9e0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
2d9f0 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
2da00 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
2da10 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
2da20 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
2da30 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
2da40 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
2da50 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
2da60 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
2da70 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
2da80 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
2da90 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
2daa0 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
2dab0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2dac0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
2dad0 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
2dae0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2daf0 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
2db00 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
2db10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2db20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
2db30 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
2db40 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
2db50 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
2db60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2db70 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
2db80 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
2db90 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
2dba0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2dbb0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
2dbc0 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
2dbd0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2dbe0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
2dbf0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
2dc00 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61  r->pParse;.  pTa
2dc10 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2dc20 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
2dc30 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2dc40 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2dc50 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
2dc60 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2dc70 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
2dc80 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2dc90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
2dca0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2dcb0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2dcc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
2dcd0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
2dce0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
2dcf0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
2dd00 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
2dd10 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2dd20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29        if( pSel )
2dd30 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
2dd40 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
2dd50 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
2dd60 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ior;.        sql
2dd70 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
2dd80 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
2dd90 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
2dda0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
2ddb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
2ddc0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
2ddd0 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
2dde0 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
2ddf0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
2de00 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
2de10 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2de20 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
2de30 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2de40 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
2de50 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
2de60 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
2de70 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
2de80 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
2de90 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2dea0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2deb0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
2dec0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2ded0 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
2dee0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2def0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2df00 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2df10 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2df20 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53  WalkNoop;.  w.xS
2df30 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2df40 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
2df50 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
2df60 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2df70 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2df80 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
2df90 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
2dfa0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2dfb0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
2dfc0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
2dfd0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
2dfe0 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
2dff0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
2e000 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
2e010 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
2e020 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
2e030 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
2e040 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
2e050 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
2e060 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
2e070 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
2e080 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
2e090 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2e0a0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2e0b0 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
2e0c0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
2e0d0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
2e0e0 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
2e0f0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
2e100 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
2e110 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
2e120 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
2e130 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
2e140 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
2e150 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
2e160 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
2e170 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
2e180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e190 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
2e1a0 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
2e1b0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
2e1c0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
2e1d0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2e1e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2e1f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e200 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2e210 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2e220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e230 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2e240 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
2e250 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
2e260 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
2e270 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
2e280 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
2e290 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
2e2a0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2e2b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2e2c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
2e2d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e2e0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
2e2f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2e300 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
2e310 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
2e320 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
2e330 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
2e340 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
2e350 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2e360 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2e370 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
2e380 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
2e390 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
2e3a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2e3b0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
2e3c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e3d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2e3e0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2e3f0 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
2e400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
2e410 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2e420 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
2e430 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
2e440 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
2e450 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
2e460 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
2e470 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
2e480 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
2e490 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
2e4a0 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
2e4b0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
2e4c0 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
2e4d0 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
2e4e0 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
2e4f0 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
2e500 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
2e510 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
2e520 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2e530 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2e540 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2e550 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2e560 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2e570 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
2e580 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67   int nReg = pAgg
2e590 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41  Info->nFunc + pA
2e5a0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2e5b0 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29  .  if( nReg==0 )
2e5c0 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20   return;.#ifdef 
2e5d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
2e5e0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
2e5f0 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74  l AggInfo regist
2e600 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74  ers are within t
2e610 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69  he range specifi
2e620 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e  ed by.  ** AggIn
2e630 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66  fo.mnReg..AggInf
2e640 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73  o.mxReg */.  ass
2e650 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49  ert( nReg==pAggI
2e660 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49  nfo->mxReg-pAggI
2e670 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a  nfo->mnReg+1 );.
2e680 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2e690 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
2e6a0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2e6b0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pAggInfo->aCol
2e6c0 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
2e6d0 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
2e6e0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
2e6f0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  aCol[i].iMem<=pA
2e700 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2e710 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2e720 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e730 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
2e740 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2e750 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  Func[i].iMem>=pA
2e760 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2e770 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2e780 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2e790 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2e7a0 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eg );.  }.#endif
2e7b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2e7c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
2e7d0 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e   0, pAggInfo->mn
2e7e0 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg, pAggInfo->m
2e7f0 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75  xReg);.  for(pFu
2e800 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
2e810 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
2e820 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2e830 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69   pFunc++){.    i
2e840 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
2e850 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2e860 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
2e870 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
2e880 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2e890 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
2e8a0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2e8b0 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
2e8c0 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
2e8d0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
2e8e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e8f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2e900 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
2e910 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
2e920 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
2e930 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
2e940 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
2e950 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
2e960 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
2e970 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
2e980 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
2e990 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
2e9a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2e9b0 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c  , pE->x.pList,0,
2e9c0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2e9d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2e9e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e9f0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
2ea00 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2ea30 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2ea40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ea50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
2ea60 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
2ea70 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
2ea80 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
2ea90 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
2eaa0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
2eab0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2eac0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
2ead0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
2eae0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2eaf0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2eb00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2eb10 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2eb20 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2eb30 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2eb40 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2eb50 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2eb60 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2eb70 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2eb80 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2eb90 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2eba0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2ebb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2ebc0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2ebd0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2ebe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ebf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
2ec00 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
2ec10 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
2ec20 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73  Expr : 0);.    s
2ec30 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2ec40 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2ec50 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2ec60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  }.}.../*.** Upda
2ec70 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2ec80 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2ec90 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2eca0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2ecb0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2ecc0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
2ecd0 49 66 20 72 65 67 41 63 63 20 69 73 20 6e 6f 6e  If regAcc is non
2ece0 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20  -zero and there 
2ecf0 61 72 65 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20  are no min() or 
2ed00 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 73  max() aggregates
2ed10 0a 2a 2a 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c  .** in pAggInfo,
2ed20 20 74 68 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c   then only popul
2ed30 61 74 65 20 74 68 65 20 70 41 67 67 49 6e 66 6f  ate the pAggInfo
2ed40 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 61  ->nAccumulator a
2ed50 63 63 75 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65  ccumulator.** re
2ed60 67 69 73 74 65 72 73 20 69 66 20 72 65 67 69 73  gisters if regis
2ed70 74 65 72 20 72 65 67 41 63 63 20 63 6f 6e 74 61  ter regAcc conta
2ed80 69 6e 73 20 30 2e 20 54 68 65 20 63 61 6c 6c 65  ins 0. The calle
2ed90 72 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  r will take care
2eda0 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e 67 20 61  .** of setting a
2edb0 6e 64 20 63 6c 65 61 72 69 6e 67 20 72 65 67 41  nd clearing regA
2edc0 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cc..*/.static vo
2edd0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
2ede0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2edf0 73 65 2c 20 69 6e 74 20 72 65 67 41 63 63 2c 20  se, int regAcc, 
2ee00 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2ee10 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2ee20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2ee30 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
2ee40 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
2ee50 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
2ee60 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2ee70 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
2ee80 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2ee90 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
2eea0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
2eeb0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
2eec0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2eed0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2eee0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2eef0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
2ef00 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
2ef10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
2ef20 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
2ef30 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
2ef40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
2ef50 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2ef60 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
2ef70 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2ef80 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
2ef90 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
2efa0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
2efb0 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
2efc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2efd0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
2efe0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
2eff0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
2f000 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
2f010 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51  t, regAgg, 0, SQ
2f020 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a  LITE_ECEL_DUP);.
2f030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f040 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
2f050 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
2f060 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
2f070 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
2f080 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
2f090 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2f0a0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
2f0b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2f0c0 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
2f0d0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
2f0e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f0f0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
2f100 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
2f110 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
2f120 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
2f130 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
2f140 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
2f150 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2f160 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
2f170 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
2f180 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
2f190 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
2f1a0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
2f1b0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2f1c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2f1d0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
2f1e0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
2f1f0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
2f200 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
2f210 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
2f220 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
2f230 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
2f240 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
2f250 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2f260 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2f270 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2f280 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
2f290 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2f2a0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2f2b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f2c0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2f2d0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
2f2e0 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
2f2f0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2f300 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
2f310 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
2f320 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2f330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2f340 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
2f350 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
2f360 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
2f370 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
2f380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f390 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp3(v, OP_AggS
2f3a0 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
2f3b0 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73  pF->iMem);.    s
2f3c0 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2f3d0 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2f3e0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2f3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f400 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
2f410 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2f420 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2f430 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2f440 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2f450 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2f460 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2f470 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2f480 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Next);.    }.  }
2f490 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30  .  if( regHit==0
2f4a0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2f4b0 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20  ccumulator ){.  
2f4c0 20 20 72 65 67 48 69 74 20 3d 20 72 65 67 41 63    regHit = regAc
2f4d0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67  c;.  }.  if( reg
2f4e0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2f4f0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2f500 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f510 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2f520 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f530 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
2f540 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
2f550 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
2f560 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
2f570 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
2f580 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2f590 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
2f5a0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
2f5b0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2f5c0 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  ode = 0;.  if( a
2f5d0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2f5e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2f5f0 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2f600 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2f610 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2f620 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2f630 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2f640 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2f650 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2f660 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2f670 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2f680 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2f690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f6a0 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2f6b0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2f6c0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2f6d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2f6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2f6f0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2f700 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2f730 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2f740 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2f750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f760 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2f770 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2f780 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2f790 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2f7a0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2f7b0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2f7c0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2f7d0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2f7e0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2f7f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f800 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c  eExplain(pParse,
2f810 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20   0, "SCAN TABLE 
2f820 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2f830 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2f840 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2f850 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2f860 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2f870 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2f880 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2f890 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2f8a0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2f8b0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2f8c0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2f8d0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2f8e0 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2f8f0 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2f900 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2f910 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2f920 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2f930 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2f940 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2f950 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2f960 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2f970 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2f980 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2f990 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2f9a0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2f9b0 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2f9c0 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2f9d0 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2f9e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2f9f0 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2fa00 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2fa10 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2fa20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2fa30 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2fa40 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2fa50 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2fa60 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2fa70 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2fa80 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2fa90 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2faa0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2fab0 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2fac0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2fad0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2fae0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2faf0 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65  TK_AND ){.    Se
2fb00 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b  lect *pS = pWalk
2fb10 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20  er->u.pSelect;. 
2fb20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2fb30 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2fb40 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2fb50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
2fb60 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2fb70 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2fb80 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2fb90 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2fba0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2fbb0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2fbc0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2fbd0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2fbe0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2fbf0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2fc00 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70  Expr *pWhere = p
2fc10 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  S->pWhere;.     
2fc20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2fc30 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2fc40 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2fc50 69 74 65 33 45 78 70 72 41 6e 64 28 70 57 61 6c  ite3ExprAnd(pWal
2fc60 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 57 68  ker->pParse, pWh
2fc70 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
2fc80 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d      pS->pWhere =
2fc90 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
2fca0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2fcb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2fcc0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2fcd0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
2fce0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2fcf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
2fd00 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72  fer eligible ter
2fd10 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49  ms from the HAVI
2fd20 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  NG clause of a q
2fd30 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a  uery, which is.*
2fd40 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65  * processed afte
2fd50 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74  r grouping, to t
2fd60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2fd70 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73   which is proces
2fd80 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72  sed before.** gr
2fd90 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d  ouping. For exam
2fda0 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a  ple, the query:.
2fdb0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2fdc0 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2fdd0 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42  HERE a=? GROUP B
2fde0 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41  Y b HAVING b=? A
2fdf0 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e  ND c=?.**.** can
2fe00 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
2fe10 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2fe20 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2fe30 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62   WHERE a=? AND b
2fe40 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2fe50 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41  VING c=?.**.** A
2fe60 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
2fe70 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ING expression i
2fe80 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74  s eligible for t
2fe90 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f  ransfer if it co
2fea0 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65  nsists.** entire
2feb0 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
2fec0 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20  and expressions 
2fed0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52  that are also GR
2fee0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61  OUP BY terms tha
2fef0 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49  t.** use the "BI
2ff00 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20  NARY" collation 
2ff10 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
2ff20 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54  tic void havingT
2ff30 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a 70 50  oWhere(Parse *pP
2ff40 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2ff50 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  {.  Walker sWalk
2ff60 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  er;.  memset(&sW
2ff70 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  alker, 0, sizeof
2ff80 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57  (sWalker));.  sW
2ff90 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
2ffa0 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
2ffb0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2ffc0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2ffd0 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
2ffe0 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
2fff0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
30000 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48  (&sWalker, p->pH
30010 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45  aving);.#if SELE
30020 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
30030 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43    if( sWalker.eC
30040 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65 33 53  ode && (sqlite3S
30050 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
30060 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45  00)!=0 ){.    SE
30070 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
30080 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20  pParse,p,("Move 
30090 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74  HAVING terms int
300a0 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20  o WHERE:\n"));. 
300b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
300c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
300d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
300e0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
300f0 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73  see if the pThis
30100 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69   entry of pTabLi
30110 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69  st is a self-joi
30120 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65  n of a prior vie
30130 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  w..** If it is, 
30140 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
30150 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72  SrcList_item for
30160 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e   the prior view.
30170 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a    If it is not,.
30180 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  ** then return 0
30190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
301a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
301b0 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28  *isSelfJoinView(
301c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
301d0 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
301e0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65  /* Search for se
301f0 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73  lf-joins in this
30200 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
30210 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
30220 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f  _item *pThis   /
30230 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69  * Search for pri
30240 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  or reference to 
30250 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f  this subquery */
30260 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
30270 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
30280 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20  ;.  for(pItem = 
30290 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
302a0 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b  em<pThis; pItem+
302b0 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  +){.    Select *
302c0 70 53 31 3b 0a 20 20 20 20 69 66 28 20 70 49 74  pS1;.    if( pIt
302d0 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  em->pSelect==0 )
302e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
302f0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
30300 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74  Coroutine ) cont
30310 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
30320 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20  tem->zName==0 ) 
30330 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
30340 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
30350 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  p(pItem->zDataba
30360 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61  se, pThis->zData
30370 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  base)!=0 ) conti
30380 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
30390 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
303a0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73  em->zName, pThis
303b0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f  ->zName)!=0 ) co
303c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 31 20  ntinue;.    pS1 
303d0 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
303e0 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
303f0 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21  >pSelect->selId!
30400 3d 70 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20  =pS1->selId ){. 
30410 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72       /* The quer
30420 79 20 66 6c 61 74 74 65 6e 65 72 20 6c 65 66 74  y flattener left
30430 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 43   two different C
30440 54 45 20 74 61 62 6c 65 73 20 77 69 74 68 20 69  TE tables with i
30450 64 65 6e 74 69 63 61 6c 0a 20 20 20 20 20 20 2a  dentical.      *
30460 2a 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 73  * names in the s
30470 61 6d 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ame FROM clause.
30480 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
30490 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
304a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
304b0 70 61 72 65 28 30 2c 20 70 54 68 69 73 2d 3e 70  pare(0, pThis->p
304c0 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20  Select->pWhere, 
304d0 70 53 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29  pS1->pWhere, -1)
304e0 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
304f0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
30500 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  This->pSelect->p
30510 48 61 76 69 6e 67 2c 20 70 53 31 2d 3e 70 48 61  Having, pS1->pHa
30520 76 69 6e 67 2c 20 2d 31 29 20 0a 20 20 20 20 29  ving, -1) .    )
30530 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  {.      /* The v
30540 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64  iew was modified
30550 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   by some other o
30560 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68  ptimization such
30570 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73   as.      ** pus
30580 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
30590 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) */.      conti
305a0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nue;.    }.    r
305b0 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d  eturn pItem;.  }
305c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
305d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  #ifdef SQLITE_CO
305e0 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49  UNTOFVIEW_OPTIMI
305f0 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74  ZATION./*.** Att
30600 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72  empt to transfor
30610 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  m a query of the
30620 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53   form.**.**    S
30630 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30640 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
30650 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
30660 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32  SELECT y FROM t2
30670 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69  ).**.** Into thi
30680 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
30690 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  CT (SELECT count
306a0 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45  (*) FROM t1)+(SE
306b0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
306c0 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65  OM t2).**.** The
306d0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
306e0 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c  only works if al
306f0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
30700 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
30710 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71  **   *  The subq
30720 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20  uery is a UNION 
30730 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ALL of two or mo
30740 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20  re terms.**   * 
30750 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
30760 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49  es not have a LI
30770 4d 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  MIT clause.**   
30780 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57  *  There is no W
30790 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59  HERE or GROUP BY
307a0 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73   or HAVING claus
307b0 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65  es on the subque
307c0 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ries.**   *  The
307d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
307e0 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a  a simple count(*
307f0 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ).**.** Return T
30800 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d  RUE if the optim
30810 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72  ization is under
30820 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  taken..*/.static
30830 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77   int countOfView
30840 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72  Optimization(Par
30850 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
30860 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
30870 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b   *pSub, *pPrior;
30880 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
30890 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a    Expr *pCount;.
308a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
308b0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
308c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
308d0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
308e0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
308f0 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
30900 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
30910 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
30920 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30930 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75    /* Single resu
30940 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70  lt column */.  p
30950 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
30960 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
30970 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
30980 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
30990 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
309a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
309b0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
309c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
309d0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
309e0 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
309f0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73  return 0;  /* Is
30a00 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66   count() */.  if
30a10 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
30a20 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=0 ) return 0; 
30a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a40 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74  /* Must be count
30a50 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  (*) */.  if( p->
30a60 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
30a70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30a90 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20  e table in FROM 
30aa0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
30ab0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
30ac0 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
30ad0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
30b00 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
30b10 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
30b20 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
30b30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
30b50 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72   be a compound r
30b60 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69  y */.  do{.    i
30b70 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f  f( pSub->op!=TK_
30b80 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ALL && pSub->pPr
30b90 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
30ba0 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f   /* Must be UNIO
30bb0 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28  N ALL */.    if(
30bc0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20   pSub->pWhere ) 
30bd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bf0 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  * No WHERE claus
30c00 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
30c10 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  b->pLimit ) retu
30c20 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
30c40 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
30c50 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73  .    if( pSub->s
30c60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
30c70 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20  regate ) return 
30c80 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e  0;     /* Not an
30c90 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
30ca0 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70    pSub = pSub->p
30cb0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Prior;          
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cd0 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76      /* Repeat ov
30ce0 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  er compound */. 
30cf0 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
30d00 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
30d10 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ch this point th
30d20 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70  en it is OK to p
30d30 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73  erform the trans
30d40 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
30d50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
30d60 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70  .  pCount = pExp
30d70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  r;.  pExpr = 0;.
30d80 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
30d90 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
30da0 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
30db0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
30dc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
30dd0 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29  ete(db, p->pSrc)
30de0 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71  ;.  p->pSrc = sq
30df0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
30e00 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
30e10 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b  zeof(*p->pSrc));
30e20 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29  .  while( pSub )
30e30 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72  {.    Expr *pTer
30e40 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  m;.    pPrior = 
30e50 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSub->pPrior;.  
30e60 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d    pSub->pPrior =
30e70 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e   0;.    pSub->pN
30e80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ext = 0;.    pSu
30e90 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
30ea0 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
30eb0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
30ec0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
30ed0 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65  .    pSub->nSele
30ee0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73  ctRow = 0;.    s
30ef0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
30f00 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70  lete(db, pSub->p
30f10 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72  EList);.    pTer
30f20 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c  m = pPrior ? sql
30f30 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
30f40 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f  pCount, 0) : pCo
30f50 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  unt;.    pSub->p
30f60 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
30f70 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
30f80 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b  arse, 0, pTerm);
30f90 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  .    pTerm = sql
30fa0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
30fb0 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20  , TK_SELECT, 0, 
30fc0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
30fd0 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
30fe0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75  arse, pTerm, pSu
30ff0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  b);.    if( pExp
31000 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  r==0 ){.      pE
31010 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  xpr = pTerm;.   
31020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
31030 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
31040 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c  pr(pParse, TK_PL
31050 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72  US, pTerm, pExpr
31060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  );.    }.    pSu
31070 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  b = pPrior;.  }.
31080 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30    p->pEList->a[0
31090 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
310a0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
310b0 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b  = ~SF_Aggregate;
310c0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
310d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
310e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
310f0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
31100 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31110 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
31120 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69  fter count-of-vi
31130 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ew optimization:
31140 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
31150 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31160 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
31170 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
31180 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31190 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
311a0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
311b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
311c0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
311d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
311e0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
311f0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
31200 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
31210 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
31220 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
31230 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
31240 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
31250 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
31260 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
31270 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
31280 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31290 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
312a0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
312b0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
312c0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
312d0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
312e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
312f0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
31300 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
31310 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31320 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
31330 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
31340 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
31350 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
31360 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
31370 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
31380 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
31390 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
313a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
313b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
313c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
313d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
313e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
313f0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
31400 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
31410 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
31420 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
31430 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
31440 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
31450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31460 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
31470 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
31480 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
31490 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
314a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
314b0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
314c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
314d0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
314e0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
314f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
31500 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
31510 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
31520 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
31530 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
31540 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
31550 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
31560 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
31570 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
31580 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
31590 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
315a0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
315b0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
315c0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
315d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
315e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
315f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
31600 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
31610 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
31620 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31630 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
31640 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
31650 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
31660 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
31670 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
31680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
31690 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
316a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
316b0 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
316c0 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
316d0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
316e0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
316f0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
31700 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
31710 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
31720 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
31730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31740 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
31750 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
31760 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
31770 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
31780 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
31790 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
317a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
317b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
317c0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
317d0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
317e0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
317f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
31800 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
31810 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20  axOrderBy = 0;  
31820 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42  /* Added ORDER B
31830 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  Y for min/max qu
31840 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69  eries */.  u8 mi
31850 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20  nMaxFlag;       
31860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
31870 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  g for min/max qu
31880 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d  eries */..  db =
31890 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
318a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
318b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
318c0 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
318d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
318e0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
318f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
31900 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
31910 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
31920 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
31930 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
31940 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
31950 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
31960 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
31970 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31980 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
31990 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  E(1,pParse,p, ("
319a0 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  begin processing
319b0 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64  :\n", pParse->ad
319c0 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69  drExplain));.  i
319d0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
319e0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
319f0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31a00 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31a10 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
31a20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
31a30 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
31a40 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
31a50 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
31a60 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
31a70 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
31a80 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
31a90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
31aa0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
31ab0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
31ac0 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
31ad0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31ae0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31af0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
31b00 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
31b10 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
31b20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
31b30 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31b40 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
31b50 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
31b60 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
31b70 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31b80 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
31b90 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31ba0 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
31bb0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
31bc0 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
31bd0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
31be0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
31bf0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
31c00 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
31c10 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
31c20 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
31c30 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
31c40 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
31c50 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
31c60 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
31c70 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
31c80 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
31c90 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
31ca0 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
31cb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
31cc0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
31cd0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
31ce0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
31cf0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
31d00 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
31d10 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
31d20 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
31d30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
31d40 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
31d50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
31d60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31d70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
31d80 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66  pEList!=0 );.#if
31d90 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31da0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
31db0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
31dc0 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c  0x104 ){.    SEL
31dd0 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70  ECTTRACE(0x104,p
31de0 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72  Parse,p, ("after
31df0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
31e00 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
31e10 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31e20 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31e30 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44  #endif..  if( pD
31e40 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31e50 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
31e60 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
31e70 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
31e80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
31e90 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
31ea0 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  C.  if( sqlite3W
31eb0 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61  indowRewrite(pPa
31ec0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
31ed0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
31ee0 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52    }.#if SELECTTR
31ef0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
31f00 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
31f10 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a  race & 0x108 ){.
31f20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
31f30 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
31f40 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72  ("after window r
31f50 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20  ewrite:\n"));.  
31f60 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31f70 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
31f80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
31f90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31fa0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
31fb0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
31fc0 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d  >pSrc;.  isAgg =
31fd0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
31fe0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
31ff0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
32000 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
32010 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
32020 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
32030 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
32040 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  to various optim
32050 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65  izations (flatte
32060 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c  ning subqueries,
32070 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20   and strength.  
32080 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20  ** reduction of 
32090 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20  join operators) 
320a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
320b0 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
320c0 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
320d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
320e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
320f0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
32100 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
32110 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
32120 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
32130 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
32140 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
32150 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
32160 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
32170 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
32180 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
32190 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
321a0 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
321b0 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  Tab;..    /* Con
321c0 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69  vert LEFT JOIN i
321d0 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72  nto JOIN if ther
321e0 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74  e are terms of t
321f0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
32200 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46     ** of the LEF
32210 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74  T JOIN used in t
32220 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
32230 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32240 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
32250 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
32260 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
32270 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
32280 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65  ullRow(p->pWhere
32290 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
322a0 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  ).     && Optimi
322b0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
322c0 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66  , SQLITE_Simplif
322d0 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  yJoin).    ){.  
322e0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
322f0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a  0x100,pParse,p,.
32300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32310 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70  ("LEFT-JOIN simp
32320 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f  lifies to JOIN o
32330 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29  n term %d\n",i))
32340 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
32350 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28  g.jointype &= ~(
32360 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
32370 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
32380 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  inExpr(p->pWhere
32390 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
323a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
323b0 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f   No futher actio
323c0 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f  n if this term o
323d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
323e0 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65  e is no a subque
323f0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  ry */.    if( pS
32400 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
32410 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
32420 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
32430 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
32440 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
32450 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
32460 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
32470 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
32480 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
32490 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
324a0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
324b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
324c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
324d0 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
324e0 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
324f0 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32510 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
32520 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
32530 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
32540 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
32550 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
32560 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
32570 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
32580 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
32590 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
325a0 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
325b0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
325c0 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
325d0 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
325e0 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
325f0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
32600 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
32610 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
32620 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
32630 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
32640 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
32650 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
32660 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
32670 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
32680 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
32690 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
326a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
326b0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
326c0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
326d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
326e0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
326f0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
32700 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
32710 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
32720 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
32730 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
32740 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
32750 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
32760 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
32770 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
32780 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
32790 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
327a0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
327b0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
327c0 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
327d0 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
327e0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
327f0 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
32800 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
32810 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
32820 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
32830 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
32840 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
32850 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
32860 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
32870 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
32880 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
32890 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
328a0 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
328b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
328c0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
328d0 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
328e0 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
328f0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
32900 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
32910 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
32920 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
32930 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
32940 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
32950 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32960 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
32970 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
32980 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
32990 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
329a0 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
329b0 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
329c0 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
329d0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
329e0 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
329f0 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
32a00 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
32a10 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
32a20 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
32a30 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
32a40 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
32a50 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
32a60 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
32a70 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
32a80 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
32a90 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
32aa0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
32ab0 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
32ac0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
32ad0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
32ae0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
32af0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
32b00 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
32b10 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
32b20 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
32b30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
32b40 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
32b50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32b60 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
32b70 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
32b80 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
32b90 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
32ba0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
32bb0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
32bc0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
32bd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32be0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
32bf0 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
32c00 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
32c10 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
32c20 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
32c30 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
32c40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
32c50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32c60 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
32c70 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
32c80 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
32c90 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
32ca0 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
32cb0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
32cc0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
32cd0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
32ce0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
32cf0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
32d00 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45  pDest);.#if SELE
32d10 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32d20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32d30 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  0x1,pParse,p,("e
32d40 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
32d50 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
32d60 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  ));.    if( (sql
32d70 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
32d80 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26 20  & 0x2000)!=0 && 
32d90 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
32da0 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d  Parent(pParse)==
32db0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
32dc0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
32dd0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
32de0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
32df0 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78  p->pNext==0 ) Ex
32e00 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
32e10 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  p(pParse);.    r
32e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
32e30 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  ndif..  /* Do th
32e40 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63  e WHERE-clause c
32e50 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
32e60 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ion optimization
32e70 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   if this is.  **
32e80 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65   a join.  No nee
32e90 64 20 74 6f 20 73 70 65 65 64 20 74 69 6d 65 20  d to speed time 
32ea0 6f 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  on this operatio
32eb0 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71  n for non-join q
32ec0 75 65 72 69 65 73 0a 20 20 2a 2a 20 61 73 20 74  ueries.  ** as t
32ed0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 70  he equivalent op
32ee0 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20  timization will 
32ef0 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 71 75  be handled by qu
32f00 65 72 79 20 70 6c 61 6e 6e 65 72 20 69 6e 0a 20  ery planner in. 
32f10 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
32f20 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20  Begin()..  */.  
32f30 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
32f40 72 63 3e 31 0a 20 20 20 26 26 20 4f 70 74 69 6d  rc>1.   && Optim
32f50 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
32f60 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f 70 61 67  b, SQLITE_Propag
32f70 61 74 65 43 6f 6e 73 74 29 0a 20 20 20 26 26 20  ateConst).   && 
32f80 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
32f90 74 73 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  ts(pParse, p).  
32fa0 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
32fb0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
32fc0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
32fd0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
32fe0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
32ff0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
33000 70 2c 28 22 41 66 74 65 72 20 63 6f 6e 73 74 61  p,("After consta
33010 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c  nt propagation:\
33020 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
33030 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
33040 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
33050 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
33060 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
33070 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33080 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  ,("Constant prop
33090 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68 65 6c 70  agation not help
330a0 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23  ful\n"));.  }..#
330b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
330c0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
330d0 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
330e0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
330f0 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
33100 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
33110 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
33120 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
33130 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
33140 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
33150 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
33160 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
33170 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
33180 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
33190 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
331a0 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
331b0 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  if..  /* For eac
331c0 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
331d0 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77  OM clause, do tw
331e0 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28  o things:.  ** (
331f0 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e  1) Authorized un
33200 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
33210 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72  s.  ** (2) Gener
33220 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
33230 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a   sub-queries.  *
33240 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
33250 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
33260 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
33270 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
33280 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
33290 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
332a0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
332b0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69  Select *pSub;.#i
332c0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
332d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
332e0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
332f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33300 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33310 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
33320 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
33330 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45   Issue SQLITE_RE
33340 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
33350 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f  s with a fake co
33360 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e  lumn name for an
33370 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  y.    ** tables 
33380 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e  that are referen
33390 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69  ced but from whi
333a0 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65  ch no values are
333b0 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20   extracted..    
333c0 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  ** Examples of w
333d0 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73  here these kinds
333e0 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f   of null SQLITE_
333f0 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
33400 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ons.    ** would
33410 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20   occur:.    **. 
33420 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
33430 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
33440 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  1;   -- SQLITE_R
33450 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a  EAD t1."".    **
33460 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a       SELECT t1.*
33470 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20   FROM t1, t2;   
33480 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
33490 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  2."".    **.    
334a0 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75  ** The fake colu
334b0 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  mn name is an em
334c0 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20  pty string.  It 
334d0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
334e0 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a  a table to.    *
334f0 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20  * have a column 
33500 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70  named by the emp
33510 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68  ty string, in wh
33520 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69  ich case there i
33530 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20  s no way to.    
33540 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  ** distinguish b
33550 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65  etween an unrefe
33560 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64  renced table and
33570 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72   an actual refer
33580 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
33590 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68  ** "" column. Th
335a0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
335b0 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
335c0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
335d0 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
335e0 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
335f0 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
33600 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
33610 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
33620 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
33630 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
33640 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
33650 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
33660 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
33670 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74   empty.    ** st
33680 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b  ring for the fak
33690 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
336a0 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
336b0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
336c0 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
336d0 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
336e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
336f0 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
33700 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
33710 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
33720 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
33730 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
33740 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
33750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
33760 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
33770 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
33780 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
33790 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
337a0 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
337b0 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
337c0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
337d0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
337e0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
337f0 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
33800 79 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  y should only be
33810 20 67 65 6e 65 72 61 74 65 64 20 6f 6e 63 65 2c   generated once,
33820 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
33830 20 20 2a 2a 20 74 65 63 68 6e 69 63 61 6c 6c 79    ** technically
33840 20 68 61 72 6d 6c 65 73 73 20 66 6f 72 20 69 74   harmless for it
33850 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
33860 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
33870 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
33880 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 77  owing assert() w
33890 69 6c 6c 20 64 65 74 65 63 74 20 69 66 20 73 6f  ill detect if so
338a0 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  mething changes 
338b0 74 6f 20 63 61 75 73 65 0a 20 20 20 20 2a 2a 20  to cause.    ** 
338c0 74 68 65 20 73 61 6d 65 20 73 75 62 71 75 65 72  the same subquer
338d0 79 20 74 6f 20 62 65 20 63 6f 64 65 64 20 6d 75  y to be coded mu
338e0 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 73  ltiple times, as
338f0 20 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65   a signal to the
33900 0a 20 20 20 20 2a 2a 20 64 65 76 65 6c 6f 70 65  .    ** develope
33910 72 73 20 74 6f 20 74 72 79 20 74 6f 20 6f 70 74  rs to try to opt
33920 69 6d 69 7a 65 20 74 68 65 20 73 69 74 75 61 74  imize the situat
33930 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ion. */.    asse
33940 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
33950 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 0a 20 20  illSub==0 );..  
33960 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
33970 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
33980 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
33990 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
339a0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
339b0 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
339c0 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
339d0 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
339e0 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
339f0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
33a00 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
33a10 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
33a20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
33a30 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
33a40 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
33a50 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
33a60 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
33a70 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
33a80 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
33a90 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
33aa0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
33ab0 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
33ac0 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
33ad0 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
33ae0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
33af0 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  (p);..    /* Mak
33b00 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73  e copies of cons
33b10 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73  tant WHERE-claus
33b20 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f  e terms in the o
33b30 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a  uter query down.
33b40 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68      ** inside th
33b50 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  e subquery.  Thi
33b60 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73  s can help the s
33b70 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d  ubquery to run m
33b80 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e  ore efficiently.
33b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33ba0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
33bb0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50  led(db, SQLITE_P
33bc0 75 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26  ushDown).     &&
33bd0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
33be0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
33bf0 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
33c00 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20  em->iCursor,.   
33c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c20 20 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e          (pItem->
33c30 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
33c40 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20  _OUTER)!=0).    
33c50 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
33c60 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
33c70 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
33c80 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
33c90 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
33ca0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
33cb0 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
33cc0 20 20 20 28 22 41 66 74 65 72 20 57 48 45 52 45     ("After WHERE
33cd0 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
33ce0 6e 20 69 6e 74 6f 20 73 75 62 71 75 65 72 79 20  n into subquery 
33cf0 25 64 3a 5c 6e 22 2c 20 70 53 75 62 2d 3e 73 65  %d:\n", pSub->se
33d00 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73  lId));.        s
33d10 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
33d20 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
33d30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
33d50 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
33d60 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68  ,pParse,p,("Push
33d70 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62  -down not possib
33d80 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  le\n"));.    }..
33d90 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
33da0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
33db0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
33dc0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
33dd0 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
33de0 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
33df0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
33e00 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75  implement the su
33e10 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20  bquery.    **.  
33e20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72    ** The subquer
33e30 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  y is implemented
33e40 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
33e50 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
33e60 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61   is.    ** guara
33e70 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20  nteed to be the 
33e80 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74  outer loop (so t
33e90 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
33ea0 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a  need to be.    *
33eb0 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20  * computed more 
33ec0 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a  than once).    *
33ed0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41  *.    ** TODO: A
33ee0 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72  re there other r
33ef0 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31  easons beside (1
33f00 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f  ) to use a co-ro
33f10 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70  utine.    ** imp
33f20 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20  lementation?.   
33f30 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30   */.    if( i==0
33f40 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
33f50 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
33f60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62          || (pTab
33f70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f  List->a[1].fg.jo
33f80 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c  intype&(JT_LEFT|
33f90 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20  JT_CROSS))!=0)  
33fa0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b  /* (1) */.    ){
33fb0 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
33fc0 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
33fd0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
33fe0 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
33ff0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
34000 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
34010 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
34020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
34030 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
34040 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
34050 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20  r(v)+1;.     .  
34060 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
34070 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
34080 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
34090 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
340a0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
340b0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
340c0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
340d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
340e0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
340f0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34100 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
34110 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
34120 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
34130 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
34140 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
34150 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
34160 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
34170 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
34180 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
34190 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22   "CO-ROUTINE %u"
341a0 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b  , pSub->selId));
341b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
341c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
341d0 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
341e0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
341f0 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
34200 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
34210 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61     pItem->fg.via
34220 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
34230 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
34240 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
34250 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
34260 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
34270 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  e(v, pItem->regR
34280 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71  eturn);.      sq
34290 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
342a0 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b  e(v, addrTop-1);
342b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
342c0 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
342d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
342e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  se{.      /* Gen
342f0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
34300 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c  ne that will fil
34310 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  l an ephemeral t
34320 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20  able with.      
34330 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
34340 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e  f this subquery.
34350 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
34360 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a  lSub will point.
34370 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
34380 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67  address of the g
34390 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74  enerated subrout
343a0 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67  ine.  pItem->reg
343b0 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  Return.      ** 
343c0 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c  is a register al
343d0 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
343e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
343f0 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20  eturn address.  
34400 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
34410 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20   topAddr;.      
34420 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30  int onceAddr = 0
34430 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41  ;.      int retA
34440 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63  ddr;.      struc
34450 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34460 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61  pPrior;..      a
34470 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
34480 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
34490 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
344a0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
344b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
344c0 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
344d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
344e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
344f0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
34500 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
34510 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
34520 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  dr+1;.      if( 
34530 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
34540 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  elated==0 ){.   
34550 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
34560 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63  ubquery is not c
34570 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66  orrelated and if
34580 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69   we are not insi
34590 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  de of.        **
345a0 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e   a trigger, then
345b0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
345c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
345d0 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ue of the subque
345e0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ry.        ** on
345f0 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ce. */.        o
34600 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65  nceAddr = sqlite
34610 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
34620 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
34630 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
34640 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34650 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
34660 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
34670 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
34680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34690 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
346a0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
346b0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
346c0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
346d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
346e0 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66   pPrior = isSelf
346f0 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73  JoinView(pTabLis
34700 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20  t, pItem);.     
34710 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20   if( pPrior ){. 
34720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34730 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
34740 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69  penDup, pItem->i
34750 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  Cursor, pPrior->
34760 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34770 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
34780 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
34790 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53          pSub->nS
347a0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
347b0 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c  r->pSelect->nSel
347c0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65  ectRow;.      }e
347d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
347e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
347f0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
34800 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
34810 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
34820 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
34830 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d  n((pParse, 1, "M
34840 41 54 45 52 49 41 4c 49 5a 45 20 25 75 22 2c 20  ATERIALIZE %u", 
34850 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSub->selId));. 
34860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
34870 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
34880 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
34890 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e   }.      pItem->
348a0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
348b0 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
348c0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
348d0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
348e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
348f0 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
34900 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
34910 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
34920 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
34930 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
34940 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34950 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
34960 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34970 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
34980 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
34990 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
349a0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
349b0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
349c0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
349d0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
349e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
349f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
34a00 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
34a10 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
34a20 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
34a30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
34a40 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
34a50 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
34a60 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
34a70 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
34a80 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
34a90 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
34aa0 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
34ab0 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
34ac0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
34ad0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
34ae0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
34af0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
34b00 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
34b10 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
34b20 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
34b30 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
34b40 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
34b50 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
34b60 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
34b70 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
34b80 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
34b90 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
34ba0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
34bb0 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
34bc0 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
34bd0 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
34be0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
34bf0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
34c00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
34c10 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
34c20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
34c30 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
34c40 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
34c50 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
34c60 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
34c70 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
34c80 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
34c90 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
34ca0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
34cb0 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
34cc0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
34cd0 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
34ce0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
34cf0 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
34d00 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
34d10 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
34d20 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
34d30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34d40 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
34d50 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
34d60 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
34d70 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
34d80 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
34d90 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
34da0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
34db0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
34dc0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
34dd0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
34de0 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
34df0 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
34e00 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
34e10 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
34e20 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
34e30 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
34e40 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
34e50 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
34e60 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
34e70 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
34e80 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
34e90 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
34ea0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
34eb0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
34ec0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
34ed0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
34ee0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
34ef0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
34f00 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
34f10 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
34f20 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
34f30 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
34f40 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
34f50 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
34f60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
34f70 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
34f80 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
34f90 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
34fa0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
34fb0 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
34fc0 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
34fd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
34fe0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
34ff0 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
35000 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
35010 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
35020 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
35030 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
35040 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
35050 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
35060 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
35070 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
35080 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
35090 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
350a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
350b0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
350c0 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
350d0 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
350e0 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
350f0 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
35100 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
35110 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
35120 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
35130 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
35140 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
35150 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
35160 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
35170 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
35180 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
35190 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
351a0 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
351b0 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
351c0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
351d0 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
351e0 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
351f0 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
35200 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
35210 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
35220 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
35230 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
35240 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
35250 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
35260 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
35270 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
35280 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
35290 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
352a0 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
352b0 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
352c0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
352d0 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
352e0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
352f0 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
35300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
35310 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
35320 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
35330 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
35340 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
35350 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
35360 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
35370 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
35380 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
35390 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
353a0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
353b0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
353c0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
353d0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
353e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
353f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
35400 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
35410 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
35420 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
35430 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
35440 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
35450 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
35460 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
35470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
35480 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35490 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
354a0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
354b0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
354c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
354d0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
354e0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
354f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
35500 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
35510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35520 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
35530 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
35540 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
35550 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
35560 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
35570 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
35580 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35590 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
355a0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
355b0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
355c0 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
355d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
355e0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
355f0 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
35600 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
35610 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
35620 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
35630 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
35640 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35650 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
35660 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
35670 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
35680 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
35690 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
356a0 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
356b0 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
356c0 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
356d0 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
356e0 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
356f0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
35700 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
35710 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
35720 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
35730 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
35740 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
35750 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
35760 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
35770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
35780 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
35790 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
357a0 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
357b0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
357c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
357d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
357e0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
357f0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
35800 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
35810 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
35820 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
35830 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
35840 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
35850 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
35860 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
35870 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
35880 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35890 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
358a0 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
358b0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
358c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
358d0 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
358e0 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
358f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
35900 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
35910 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
35920 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
35930 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
35940 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
35950 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
35960 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
35970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35980 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61      | (p->selFla
35990 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
359a0 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  it);.#ifndef SQL
359b0 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
359c0 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  UNC.    Window *
359d0 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20  pWin = p->pWin; 
359e0 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77       /* Master w
359f0 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72  indow object (or
35a00 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66   NULL) */.    if
35a10 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( pWin ){.      
35a20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
35a30 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57  eInit(pParse, pW
35a40 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
35a50 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48  f.    assert( WH
35a60 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53  ERE_USE_LIMIT==S
35a70 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a  F_FixedLimit );.
35a80 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
35a90 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
35aa0 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54  . */.    SELECTT
35ab0 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
35ac0 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
35ad0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
35ae0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35af0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
35b00 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
35b10 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
35b40 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
35b50 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  , p->nSelectRow)
35b60 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
35b70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
35b80 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
35b90 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
35ba0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
35bb0 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
35bc0 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
35bd0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
35be0 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
35bf0 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
35c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
35c10 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
35c20 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
35c30 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
35c40 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
35c50 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = 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 3b 0a 20  tinct(pWInfo);. 
35c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
35c90 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
35ca0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35cb0 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35cc0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
35cd0 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c  );.      sSort.l
35ce0 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71 6c  abelOBLopt = sql
35cf0 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42 79  ite3WhereOrderBy
35d00 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70 57  LimitOptLabel(pW
35d10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
35d20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
35d30 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35d40 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
35d50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35d60 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
35d70 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
35d80 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
35d90 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
35da0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
35db0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
35dc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
35dd0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
35de0 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
35df0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
35e00 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
35e10 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
35e20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
35e30 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35e40 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
35e50 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
35e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35e70 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
35e80 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35e90 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
35ea0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
35eb0 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66  t==pEList );.#if
35ec0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35ed0 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
35ee0 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
35ef0 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20    int addrGosub 
35f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35f10 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
35f20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 20        int iCont 
35f30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35f40 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
35f50 20 20 20 20 20 20 69 6e 74 20 69 42 72 65 61 6b        int iBreak
35f60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35f70 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
35f80 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47 6f  .      int regGo
35f90 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  sub = ++pParse->
35fa0 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nMem;..      sql
35fb0 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
35fc0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
35fd0 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
35fe0 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20 20  addrGosub);..   
35ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36000 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
36010 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
36020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36030 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
36040 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20  drGosub);.      
36050 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
36060 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70 20  (v, "inner-loop 
36070 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
36080 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c       sSort.label
36090 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20 20  OBLopt = 0;.    
360a0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
360b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
360c0 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
360d0 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e  nct, pDest, iCon
360e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
360f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36100 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
36110 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
36120 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
36130 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f  OP_Return, regGo
36140 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65  sub);.      Vdbe
36150 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
36160 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72   inner-loop subr
36170 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20  outine"));.     
36180 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
36190 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
361a0 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  ak);.    }else.#
361b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
361c0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
361d0 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f  */.    {.      /
361e0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
361f0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
36200 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  /.      selectIn
36210 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
36220 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  p, -1, &sSort, &
36230 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
36240 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
36250 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
36260 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
36270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
36280 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
36290 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20  pWInfo));..     
362a0 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
362b0 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
362c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
362d0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
362e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
362f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
36300 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
36310 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
36320 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
36330 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
36340 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
36350 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
36360 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
36370 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
36380 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
36390 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
363a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
363b0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
363c0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
363d0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
363e0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
363f0 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
36400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
36410 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
36420 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
36430 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
36440 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
36450 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
36460 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
36470 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
36480 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
36490 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
364a0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
364b0 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
364c0 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364e0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
364f0 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
36500 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
36510 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
36520 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
36530 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
36540 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
36550 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
36560 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
36570 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
36580 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
36590 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
365a0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
365b0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
365c0 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
365d0 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
365e0 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
365f0 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
36600 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
36610 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
36620 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
36630 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
36640 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
36650 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
36660 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
36670 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
36680 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
36690 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
366a0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
366b0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
366c0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
366d0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
366e0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
366f0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
36700 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
36710 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
36720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36730 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
36740 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
36750 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
36760 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
36770 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
36780 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
36790 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
367a0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
367b0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
367c0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
367d0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
367e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
367f0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
36800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36810 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
36820 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
36830 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
36840 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
36850 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
36860 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
36870 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
36880 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 66==sqlite3Lo
36890 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20  gEst(100) );.   
368a0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
368b0 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65  tRow>66 ) p->nSe
368c0 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20  lectRow = 66;.  
368d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
368e0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
368f0 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20  3LogEst(1) );.  
36900 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
36910 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  w = 0;.    }..  
36920 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
36930 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
36940 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
36950 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
36960 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
36970 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
36980 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
36990 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
369a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
369b0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
369c0 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
369d0 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
369e0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
369f0 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
36a00 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
36a10 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
36a20 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
36a30 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a   BY might use a.
36a40 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
36a50 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65  index that cause
36a60 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f  s rows to be gro
36a70 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73  uped together as
36a80 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
36a90 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
36aa0 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72  y sorted. Either
36ab0 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65   way, record the
36ac0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20   fact that the. 
36ad0 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61     ** ORDER BY a
36ae0 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
36af0 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ses are the same
36b00 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
36b10 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a  orderByGrp.    *
36b20 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
36b30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
36b40 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
36b50 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70  GroupBy, sSort.p
36b60 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
36b70 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79  ){.      orderBy
36b80 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Grp = 1;.    }. 
36b90 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
36ba0 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
36bb0 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
36bc0 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
36bd0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
36be0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
36bf0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
36c00 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
36c10 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
36c20 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
36c30 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
36c40 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
36c50 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
36c60 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
36c70 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
36c80 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
36c90 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
36ca0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
36cb0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
36cc0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
36cd0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
36ce0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
36cf0 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
36d00 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e  st;.    sNC.uNC.
36d10 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
36d20 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e  Info;.    VVA_ON
36d30 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  LY( sNC.ncFlags 
36d40 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29  = NC_UAggInfo; )
36d50 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
36d60 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
36d70 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
36d80 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
36d90 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
36da0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
36db0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
36dc0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
36dd0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
36de0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
36df0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
36e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
36e10 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
36e20 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
36e30 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
36e40 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
36e50 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
36e60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36e70 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
36e80 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  re );.        as
36e90 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d 70  sert( pHaving==p
36ea0 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20 20  ->pHaving );.   
36eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47 72       assert( pGr
36ec0 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70  oupBy==p->pGroup
36ed0 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  By );.        ha
36ee0 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
36ef0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
36f00 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
36f10 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
36f20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
36f30 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
36f40 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
36f50 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
36f60 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
36f70 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
36f80 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47  n;.    if( p->pG
36f90 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e  roupBy==0 && p->
36fa0 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73 41  pHaving==0 && sA
36fb0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20  ggInfo.nFunc==1 
36fc0 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ){.      minMaxF
36fd0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
36fe0 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  y(db, sAggInfo.a
36ff0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26  Func[0].pExpr, &
37000 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b  pMinMaxOrderBy);
37010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37020 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57    minMaxFlag = W
37030 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
37040 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MAL;.    }.    f
37050 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
37060 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
37070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
37080 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
37090 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
370a0 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
370b0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
370c0 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
370d0 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
370e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
370f0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
37100 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37110 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
37120 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
37130 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
37140 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
37150 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
37160 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
37170 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
37180 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
37190 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69  o select_end;.#i
371a0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
371b0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
371c0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
371d0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
371e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
371f0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
37200 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
37210 65 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61  er aggregate ana
37220 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
37230 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
37240 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
37250 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
37260 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
37270 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
37280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37290 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63  bugPrintf("agg-c
372a0 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25  olumn[%d] iMem=%
372b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
372c0 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
372d0 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  Col[ii].iMem);. 
372e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
372f0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
37300 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
37310 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
37320 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d   }.      for(ii=
37330 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
37340 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Func; ii++){.   
37350 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
37360 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e  gPrintf("agg-fun
37370 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e  c[%d]: iMem=%d\n
37380 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
37390 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  i, sAggInfo.aFun
373a0 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  c[ii].iMem);.   
373b0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
373c0 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67  ViewExpr(0, sAgg
373d0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70  Info.aFunc[ii].p
373e0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
373f0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
37400 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
37410 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
37420 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
37430 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
37440 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
37450 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
37460 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
37470 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
37480 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
37490 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
374a0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
374b0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
374c0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
374d0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
374e0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
374f0 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
37500 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
37510 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
37520 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
37530 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
37540 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
37550 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
37560 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
37570 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
37580 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
37590 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
375a0 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
375b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
375c0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
375d0 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
375e0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
375f0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
37600 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
37610 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
37620 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
37630 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
37640 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
37650 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
37660 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
37670 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
37680 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
37690 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
376a0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
376b0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
376c0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
376d0 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
376e0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
376f0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
37700 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
37710 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
37720 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
37730 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
37740 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
37750 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
37760 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
37770 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
37780 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
37790 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
377a0 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
377b0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
377c0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
377d0 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
377e0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
377f0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
37800 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
37810 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
37820 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
37830 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
37840 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
37850 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
37860 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
37870 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
37880 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67 67 49  pGroupBy,0,sAggI
37890 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
378a0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
378b0 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
378c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
378d0 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
378e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
378f0 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
37900 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
37910 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
37920 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
37930 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
37940 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
37950 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
37960 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
37970 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
37980 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
37990 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
379a0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
379b0 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
379c0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
379d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
379e0 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
379f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37a00 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
37a10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
37a20 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
37a30 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
37a40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37a50 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
37a60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
37a70 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
37a80 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
37a90 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
37aa0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
37ab0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
37ac0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
37ad0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
37ae0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
37af0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
37b00 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
37b10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37b20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
37b30 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
37b40 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
37b50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
37b60 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
37b70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37b80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
37b90 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
37ba0 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
37bb0 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
37bc0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
37bd0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
37be0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
37bf0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
37c00 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
37c10 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
37c20 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
37c30 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
37c40 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
37c50 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
37c60 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
37c70 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
37c80 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
37c90 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
37ca0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
37cb0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
37cc0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
37cd0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
37ce0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37cf0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
37d00 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
37d10 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
37d20 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
37d30 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
37d40 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
37d50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
37d60 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
37d70 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
37d80 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
37d90 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
37da0 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
37db0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
37dc0 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
37dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
37de0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
37df0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
37e00 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
37e10 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
37e20 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
37e30 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
37e40 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
37e50 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
37e60 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
37e70 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
37e80 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
37e90 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
37ea0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
37eb0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
37ec0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
37ed0 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
37ee0 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
37ef0 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
37f00 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
37f10 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
37f20 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
37f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37f40 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
37f50 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
37f60 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
37f70 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
37f80 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
37f90 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
37fa0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
37fb0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
37fc0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
37fd0 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
37fe0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
37ff0 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
38000 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
38010 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
38020 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
38030 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
38040 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
38050 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
38060 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
38070 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
38080 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
38090 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
380a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
380b0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
380c0 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
380d0 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
380e0 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
380f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
38100 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
38110 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
38120 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
38130 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
38140 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
38150 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
38160 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
38170 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
38180 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
38190 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
381a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
381b0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
381c0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
381d0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
381e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
381f0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
38200 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
38210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
38220 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
38230 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
38240 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
38250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
38260 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
38270 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
38280 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20  By, regBase, 0, 
38290 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
382a0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
382b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
382c0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
382d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
382e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
382f0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
38300 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
38310 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
38320 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
38330 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
38340 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
38350 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
38360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
38370 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
38380 6c 65 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20  le(v,.          
38390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383a0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
383b0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70   pCol->iTable, p
383c0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72 31  Col->iColumn, r1
383d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
383e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
383f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38400 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
38410 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65