/ Hex Artifact Content
Login

Artifact 0c08c5e6ba14920aa093dd7e2f51b53d16e5b732c45008f29cdc2fa321566ea8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   && p->x.pList )
3380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
3390: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
33b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
33c0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
33d0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
33e0: 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  xpr, iTable);.  
33f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3400: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
3410: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
3420: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
3430: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64  ;.  } .}../* Und
3440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65  o the work of se
3450: 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e  tJoinExpr().  In
3460: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3470: 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20  tree p, convert 
3480: 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68  every.** term th
3490: 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  at is marked wit
34a0: 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e  h EP_FromJoin an
34b0: 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  d iRightJoinTabl
34c0: 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a  e==iTable into.*
34d0: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65  * an ordinary te
34e0: 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  rm that omits th
34f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61  e EP_FromJoin ma
3500: 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68  rk..**.** This h
3510: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45  appens when a LE
3520: 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c  FT JOIN is simpl
3530: 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72  ified into an or
3540: 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a  dinary JOIN..*/.
3550: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65  static void unse
3560: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3570: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3580: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
35a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
35b0: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69  Join).     && (i
35c0: 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52  Table<0 || p->iR
35d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
35e0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
35f0: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
3600: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3620: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3630: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3640: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3660: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3670: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3680: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3690: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36a0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36c0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36d0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
36e0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
36f0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3720: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3730: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3740: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3750: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3760: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3770: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3780: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
3790: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
37a0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
37b0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
37c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
37d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
37e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
37f0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3800: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3820: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3830: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3840: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3850: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3860: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3870: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3880: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
3890: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
38a0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
38b0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
38c0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
38d0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
38e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
38f0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3900: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3910: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3920: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3930: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3940: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3950: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3960: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3990: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
39a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39b0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
39c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
39d0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
39e0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a00: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3a10: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3a50: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3a60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3a70: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3a80: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3a90: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ab0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3ac0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
3ae0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3af0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3b00: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3b10: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3b20: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3b30: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3b40: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3b50: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3b60: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3b70: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3b80: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3b90: 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d  ER(pLeft->pTab==
3ba0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3bb0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
3bc0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3bd0: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3be0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3bf0: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3c00: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3c10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3c20: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3c30: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3c40: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3c50: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3c60: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
3c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c80: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
3c90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
3ca0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
3cb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
3cc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cf0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3d00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3d10: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3d20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3d30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d60: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
3d70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3d80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
3da0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
3db0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3dc0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3dd0: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3de0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3df0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3e00: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3e10: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3e20: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3e30: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3e40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3e50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3e60: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3e70: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3e80: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3e90: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
3ea0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3eb0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3ec0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3ed0: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3f00: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3f20: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3f30: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f40: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3f50: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3f60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3f70: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
3f80: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3fb0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
3fc0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3fd0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3fe0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4010: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
4020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4030: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
4040: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
4050: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
4060: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
4070: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
4080: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
4090: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
40a0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
40b0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
40c0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
40d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
40e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5720: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
5730: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5740: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
5750: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
5780: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
5790: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
57a0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
57b0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
57c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
57d0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
57e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
57f0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
5800: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
5810: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
5820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5830: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5840: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
5850: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
5860: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69   nData);.  }.  i
5870: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
5880: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
5890: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
58a0: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
58b0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
58c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
58d0: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
58e0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
58f0: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
5900: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
5910: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
5920: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
5930: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
5940: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5950: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
5960: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
5970: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
5980: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
5990: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
59a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
59b0: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
59c0: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
59d0: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
59e0: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
59f0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
5a00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
5a10: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
5a20: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
5a30: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
5a40: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
5a50: 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  );.    regPrevKe
5a60: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
5a70: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5a80: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
5a90: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
5aa0: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
5ab0: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
5ac0: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
5ad0: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5af0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
5b00: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5b10: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
5b20: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
5b50: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
5b60: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
5b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5ba0: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
5bb0: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
5bc0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5bd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5be0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
5bf0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
5c00: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
5c10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5c20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
5c30: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
5c40: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
5c50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5c60: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
5c70: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
5c80: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
5c90: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
5ca0: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5cd0: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
5ce0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
5cf0: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
5d00: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
5d10: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
5d20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5d30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
5d40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
5d50: 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64  arse,pSort->pOrd
5d60: 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20  erBy,nOBSat,.   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c          pKI->nAl
5da0: 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79  lField-pKI->nKey
5db0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
5dc0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
5dd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5e00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
5e10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
5e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5e30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
5e40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
5e50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5e60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
5e70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
5e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ea0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
5eb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
5ec0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
5ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ee0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
5ef0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5f00: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5f10: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5f40: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5f50: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5f60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5f70: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5f90: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5fb0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5fc0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
5fd0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
5fe0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
5ff0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6000: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
6010: 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a    if( iLimit ){.
6020: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
6030: 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73 20  oint the values 
6040: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72 74  for the new sort
6050: 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  er entry are sto
6060: 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61 6e  red.    ** in an
6070: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
6080: 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20 74  ers. They need t
6090: 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69 6e  o be composed in
60a0: 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20 20  to a record.    
60b0: 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64 20  ** and inserted 
60c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  into the sorter 
60d0: 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
60e0: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
60f0: 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  y.    ** less th
6100: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
6110: 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68 65  items or (b) the
6120: 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 73   new record is s
6130: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20  maller than .   
6140: 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20   ** the largest 
6150: 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79  record currently
6160: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   in the sorter. 
6170: 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20 61  If (b) is true a
6180: 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  nd there.    ** 
6190: 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d 49  are already LIMI
61a0: 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69  T+OFFSET items i
61b0: 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64 65  n the sorter, de
61c0: 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  lete the largest
61d0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62 65  .    ** entry be
61e0: 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
61f0: 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69 73  he new one. This
6200: 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20 6e   way there are n
6210: 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  ever more .    *
6220: 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  * than LIMIT+OFF
6230: 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65  SET items in the
6240: 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a 0a   sorter..    **.
6250: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 65      ** If the ne
6260: 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f  w record does no
6270: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 73  t need to be ins
6280: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  erted into the s
6290: 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a 75  orter,.    ** ju
62a0: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
62b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
62c0: 6c 6f 6f 70 2e 20 49 66 20 74 68 65 20 70 53 6f  loop. If the pSo
62d0: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 0a  rt->labelOBLopt.
62e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
62f0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
6300: 74 20 69 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  t is a label of 
6310: 77 68 65 72 65 20 74 6f 20 6a 75 6d 70 2e 20 20  where to jump.  
6320: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
6330: 2a 20 6a 75 73 74 20 62 79 70 61 73 73 20 74 68  * just bypass th
6340: 65 20 72 6f 77 20 69 6e 73 65 72 74 20 6c 6f 67  e row insert log
6350: 69 63 2e 20 20 53 65 65 20 74 68 65 20 68 65 61  ic.  See the hea
6360: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
6370: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
6380: 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d  3WhereOrderByLim
6390: 69 74 4f 70 74 4c 61 62 65 6c 28 29 20 66 75 6e  itOptLabel() fun
63a0: 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
63b0: 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20 20 20 20 2a  onal info..    *
63c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d  /.    int iCsr =
63d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6400: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  NotZero, iLimit,
6410: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6420: 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20  entAddr(v)+4);. 
6430: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6440: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6460: 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a  Last, iCsr, 0);.
6470: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
6480: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6490: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20  (v, OP_IdxLE,.  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
64c0: 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  Csr, 0, regBase+
64d0: 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f  nOBSat, nExpr-nO
64e0: 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43  BSat);.    VdbeC
64f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6520: 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iCsr);.  }.  if(
6530: 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b   regRecord==0 ){
6540: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
6550: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
6560: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
6570: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
6580: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20  e, nBase);.  }. 
6590: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
65a0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65b0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
65c0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
65d0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
65e0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
65f0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
6600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6610: 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  nt(v, op, pSort-
6620: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
6630: 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6650: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
6660: 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66  se-nOBSat);.  if
6670: 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 73  ( iSkip ){.    s
6680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6690: 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20  P2(v, iSkip,.   
66a0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62        pSort->lab
66b0: 65 6c 4f 42 4c 6f 70 74 20 3f 20 70 53 6f 72 74  elOBLopt ? pSort
66c0: 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3a 20  ->labelOBLopt : 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
66e0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a  ntAddr(v));.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6700: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
6710: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
6720: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
6730: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6750: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6760: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6770: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6780: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6790: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
67a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
67b0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
67c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
67d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
67e0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
67f0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
6800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6810: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6820: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6830: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
6840: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6860: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6880: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6890: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
68a0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
68b0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
68c0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
68d0: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
68e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
68f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
6900: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
6910: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
6920: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
6930: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
6940: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6950: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6960: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6970: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6980: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6990: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
69a0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
69b0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
69c0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
69d0: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
69e0: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
69f0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6a00: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6a10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6a20: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6a30: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6a60: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6a70: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6a80: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6a90: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6aa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6ab0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6ac0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ae0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6af0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6b10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6b20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6b30: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6b40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6b50: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b60: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6b80: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6b90: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6ba0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6bb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6be0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6c10: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6c20: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6c50: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6c80: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6ca0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6cd0: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6ce0: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6cf0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6d00: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6d10: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6d20: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6d30: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6d40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6d50: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6d60: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6d70: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6d80: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6d90: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6da0: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6db0: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6dc0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6dd0: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6de0: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6e00: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6e10: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6e30: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6e40: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6e50: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6e60: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6e70: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6e80: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6e90: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6ea0: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6eb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6ec0: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6ed0: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6ee0: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6ef0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6f00: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6f10: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6f20: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6f30: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6f40: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
6f50: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
6f60: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
6f70: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
6f80: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
6f90: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
6fa0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
6fb0: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
6fc0: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
6fd0: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
6fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
6ff0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
7000: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
7010: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7020: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
7030: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
7040: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7050: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7060: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7070: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7080: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7090: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
70a0: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
70b0: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
70c0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
70d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
70e0: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
70f0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
7100: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
7110: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
7120: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
7130: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
7140: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7150: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7160: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7170: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7180: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7190: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
71a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
71b0: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
71c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
71f0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
7200: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
7220: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
7230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7240: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7260: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7270: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7280: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
72a0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
72b0: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
72c0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
72d0: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
72e0: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
72f0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
7300: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7310: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7320: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
7340: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7350: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7360: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7370: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7380: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7390: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
73a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
73b0: 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
73c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
73d0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
73e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
73f0: 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72 74   pTab && !IsVirt
7400: 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20  ual(pTab).      
7410: 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b   && (pTab->aCol[
7420: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
7430: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
7440: 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20  AG_SORTERREF).  
7450: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
7460: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
7470: 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b  r(j=0; j<nDefer;
7480: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7490: 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66   if( pSort->aDef
74a0: 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70  er[j].iCsr==pExp
74b0: 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  r->iTable ) brea
74c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
74d0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66       if( j==nDef
74e0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
74f0: 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61  if( nDefer==Arra
7500: 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65  ySize(pSort->aDe
7510: 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  fer) ){.        
7520: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7530: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7540: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
7550: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
7560: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
7570: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
7580: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pk = 0;.        
7590: 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
75a0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
75b0: 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73           pPk = s
75c0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
75d0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
75e0: 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20             nKey 
75f0: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7610: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
7620: 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b  0; k<nKey; k++){
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
7640: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
7650: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7660: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30   TK_COLUMN, 0, 0
7670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7680: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
76a0: 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  w->iTable = pExp
76b0: 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
76d0: 3e 79 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  >y.pTab = pExpr-
76e0: 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
76f0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
7700: 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70  Column = pPk ? p
7710: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  Pk->aiColumn[k] 
7720: 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  : -1;.          
7730: 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73        pExtra = s
7740: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7750: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78  pend(pParse, pEx
7760: 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  tra, pNew);.    
7770: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
77a0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62  fer[nDefer].pTab
77b0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
77c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
77d0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
77e0: 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72  er].iCsr = pExpr
77f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
7800: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
7810: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79  fer[nDefer].nKey
7820: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20   = nKey;.       
7830: 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20       nDefer++;. 
7840: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
7860: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
7870: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7880: 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e  }.  }.  pSort->n
7890: 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66  Defer = (u8)nDef
78a0: 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d  er;.  *ppExtra =
78b0: 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69   pExtra;.}.#endi
78c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
78d0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
78e0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
78f0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
7900: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
7910: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
7920: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
7930: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
7940: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
7950: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
7960: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
7970: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
7980: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
7990: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
79a0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
79b0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
79c0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
79d0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
79e0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
79f0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7a00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7a10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7a20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7a30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
7a40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
7a50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
7a60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
7a70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7a80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7a90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
7aa0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
7ab0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
7ac0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
7ad0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7af0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
7b00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
7b10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
7b20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7b30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
7b40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7b50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
7b60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
7b70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
7b80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
7b90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7ba0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
7bb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
7bc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
7bd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
7be0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
7bf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
7c00: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
7c10: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
7c20: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
7c30: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
7c40: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
7c50: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c60: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
7c70: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
7c80: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7c90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7ca0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
7cb0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
7cc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7cd0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
7ce0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
7cf0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
7d00: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
7d10: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
7d20: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
7d30: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
7d40: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
7d50: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7d60: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
7d70: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
7d80: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
7db0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
7dc0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
7dd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7de0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
7df0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
7e00: 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66   */.  RowLoadInf
7e10: 6f 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20  o sRowLoadInfo; 
7e20: 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65    /* Info for de
7e30: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
7e40: 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  ng */..  /* Usua
7e50: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
7e60: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7e70: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7e80: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7e90: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7ea0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7eb0: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7ec0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7ed0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7ee0: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7ef0: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7f00: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
7f10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
7f20: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
7f30: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
7f40: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
7f50: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
7f60: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7f70: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7f80: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7f90: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7fa0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7fb0: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7fd0: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
7fe0: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
7ff0: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
8000: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
8020: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
8030: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
8040: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
8050: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
8060: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
8070: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
8080: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
8090: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
80a0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
80b0: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
80c0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
80d0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
80e0: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
80f0: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
8100: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
8110: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
8120: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
8130: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
8140: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
8150: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
8160: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
8170: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
8180: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
8190: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
81a0: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
81b0: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
81c0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
81d0: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
81e0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
81f0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
8200: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
8210: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
8220: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
8230: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
8240: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8250: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
8260: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
8270: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
8280: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
8290: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
82a0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
82b0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
82c0: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
82d0: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
82e0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
82f0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
8300: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
8310: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
8320: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
8330: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
8340: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
8350: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
8360: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
8370: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
8380: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
8390: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
83a0: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
83b0: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
83c0: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
83d0: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
83e0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
83f0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
8400: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
8410: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
8420: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
8430: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
8440: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
8450: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8460: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
8470: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
8480: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
8490: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
84a0: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
84b0: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
84c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
84d0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
84e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
84f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8510: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
8520: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
8530: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
8540: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
8550: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
8560: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
8570: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
8580: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
8590: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
85a0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
85b0: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
85c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
85d0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
85e0: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
85f0: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
8600: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
8610: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
8620: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
8630: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
8640: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8650: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20  u8 ecelFlags;   
8660: 20 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e   /* "ecel" is an
8670: 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66   abbreviation of
8680: 20 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69   "ExprCodeExprLi
8690: 73 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  st" */.    ExprL
86a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
86b0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
86c0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
86d0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
86e0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
86f0: 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   ){.      ecelFl
8700: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45  ags = SQLITE_ECE
8710: 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65  L_DUP;.    }else
8720: 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67  {.      ecelFlag
8730: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 0;.    }.   
8740: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61   if( pSort && ha
8750: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20  sDistinct==0 && 
8760: 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d  eDest!=SRT_Ephem
8770: 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52  Tab && eDest!=SR
8780: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
8790: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   /* For each exp
87a0: 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45  ression in p->pE
87b0: 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63  List that is a c
87c0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
87d0: 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sion in.      **
87e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
87f0: 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72  ause (pSort->pOr
8800: 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20  derBy), set the 
8810: 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20  associated .    
8820: 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c    ** iOrderByCol
8830: 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f   value to one mo
8840: 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65  re than the inde
8850: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
8860: 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  Y .      ** expr
8870: 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
8880: 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20  e sort-key that 
8890: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
88a0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
88b0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c        ** This al
88c0: 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69  lows the p->pELi
88d0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
88e0: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
88f0: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
8900: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
8910: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
8920: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
8930: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
8940: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
8950: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
8960: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
8970: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
8980: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
8990: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
89a0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
89b0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
89c0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
89d0: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
89e0: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
89f0: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8a00: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8a10: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8a20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8a50: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8a60: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
8a70: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
8a80: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
8a90: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
8aa0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
8ab0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8ac0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8ad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8ae0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8af0: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8b00: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8b10: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8b20: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8b30: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8b40: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8b50: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
8b60: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
8b70: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
8b80: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
8b90: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
8ba0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
8bb0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8bc0: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8bd0: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8be0: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8bf0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8c00: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8c10: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8c20: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8c30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8c40: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8c50: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
8c60: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
8c70: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
8c80: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
8c90: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8ca0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8cb0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8cc0: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8cd0: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8ce0: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8cf0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8d00: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8d10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8d20: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
8d30: 2a 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74  * Adjust nResult
8d40: 43 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Col to account f
8d50: 6f 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  or columns that 
8d60: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20  are omitted.    
8d70: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f    ** from the so
8d80: 72 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69  rter by the opti
8d90: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  mizations in thi
8da0: 73 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20  s branch */.    
8db0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
8dc0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  List;.      for(
8dd0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8de0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8df0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8e00: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8e10: 79 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51  yCol>0.#ifdef SQ
8e20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
8e30: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
8e40: 20 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74         || pEList
8e50: 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  ->a[i].bSorterRe
8e60: 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  f.#endif.       
8e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52   ){.          nR
8e80: 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20  esultCol--;.    
8e90: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
8ea0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
8eb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
8ec0: 63 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b  case( regOrig );
8ed0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ee0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
8ef0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8f00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  e( eDest==SRT_Me
8f10: 6d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  m );.      testc
8f20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f30: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
8f40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
8f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f70: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
8f80: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8f90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8fa0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8fb0: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8fc0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8fd0: 20 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49   }.    sRowLoadI
8fe0: 6e 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20  nfo.regResult = 
8ff0: 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73  regResult;.    s
9000: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c  RowLoadInfo.ecel
9010: 46 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67  Flags = ecelFlag
9020: 73 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  s;.#ifdef SQLITE
9030: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
9040: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52  EFERENCES.    sR
9050: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72  owLoadInfo.pExtr
9060: 61 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20  a = pExtra;.    
9070: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67  sRowLoadInfo.reg
9080: 45 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65  ExtraResult = re
9090: 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c  gResult + nResul
90a0: 74 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  tCol;.    if( pE
90b0: 78 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f  xtra ) nResultCo
90c0: 6c 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  l += pExtra->nEx
90d0: 70 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  pr;.#endif.    i
90e0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20  f( p->iLimit.   
90f0: 20 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20    && (ecelFlags 
9100: 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
9110: 49 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20  ITREF)!=0 .     
9120: 26 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a  && nPrefixReg>0.
9130: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
9140: 65 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b  ert( pSort!=0 );
9150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
9160: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  asDistinct==0 );
9170: 0a 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44  .      pSort->pD
9180: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d  eferredRowLoad =
9190: 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a   &sRowLoadInfo;.
91a0: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
91b0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
91c0: 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61      innerLoopLoa
91d0: 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20  dRow(pParse, p, 
91e0: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a  &sRowLoadInfo);.
91f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9200: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
9210: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
9220: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
9230: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
9240: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
9250: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
9260: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
9270: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
9280: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
9290: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
92a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
92b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
92c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
92d0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
92e0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
92f0: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
9300: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
9310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
9320: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
9330: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
9340: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
9350: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
9360: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
9370: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
9380: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
9390: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
93a0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
93b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
93c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
93d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
93e0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
93f0: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
9400: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9410: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9420: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
9430: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
9440: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
9450: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
9460: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
9470: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
9480: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
9490: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
94a0: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
94b0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
94c0: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
94d0: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
94e0: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
94f0: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
9500: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
9510: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
9520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
9530: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
9540: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
9550: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
9560: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9580: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
9590: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
95b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
95c0: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
95d0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
95e0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
95f0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
9600: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
9610: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
9620: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
9630: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
9640: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9650: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
9660: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
9670: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
9680: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
9690: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
96a0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
96b0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
96c0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
96d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
96e0: 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f   if( i<nResultCo
96f0: 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l-1 ){.         
9700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9710: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
9720: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d  egResult+i, iJum
9730: 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  p, regPrev+i);. 
9740: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
9750: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9780: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9790: 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Eq, regResult+i
97a0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  , iContinue, reg
97b0: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
97c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
97d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
97e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
97f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
9800: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
9810: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
9820: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9840: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
9850: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
9860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
9870: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
9880: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
9890: 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d  iJump || pParse-
98a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
98b0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
98c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
98d0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
98e0: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
98f0: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
9900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9910: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
9920: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
9930: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
9940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9950: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
9960: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
9970: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9980: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9990: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
99a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
99b0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
99c0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
99d0: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
99e0: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
99f0: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
9a00: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
9a10: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
9a20: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
9a30: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
9a40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62  sult);.        b
9a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
9a70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  t==0 ){.      co
9a80: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9a90: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
9aa0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
9ab0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
9ac0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
9ad0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
9ae0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
9af0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
9b00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
9b10: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
9b20: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
9b30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9b40: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
9b50: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
9b60: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
9b70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
9b80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
9b90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
9bc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9bd0: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
9be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bf0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9c00: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9c10: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9c20: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73  ultCol);.      s
9c30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9c40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
9c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
9c70: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
9c80: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
9c90: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
9ca0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
9cb0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
9cc0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
9cd0: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
9ce0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
9cf0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
9d00: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
9d10: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
9d20: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
9d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9d40: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
9d50: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
9d60: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9d70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9d80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9d90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9da0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ND_SELECT */..  
9db0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
9dc0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
9dd0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
9de0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
9df0: 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20  e SRT_Fifo:.    
9e00: 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66  case SRT_DistFif
9e10: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
9e20: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
9e30: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
9e40: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
9e50: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
9e60: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66  ge(pParse, nPref
9e70: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
9e80: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9e90: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
9ec0: 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
9ed0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9ee0: 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65  Fifo );.      te
9ef0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9f00: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
9f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9f30: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9f40: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9f50: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
9f80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f90: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
9fa0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
9fb0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
9fc0: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
9fd0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
9fe0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
9ff0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
a000: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
a010: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
a020: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
a030: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
a040: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
a050: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
a060: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
a070: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
a080: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
a090: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
a0a0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
a0b0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
a0c0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
a0d0: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
a0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
a0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a100: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
a110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a120: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a130: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
a140: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
a150: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a160: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a180: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a190: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
a1a0: 20 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52   r1,regResult,nR
a1b0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a1c0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
a1d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
a1e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
a1f0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a200: 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75   assert( regResu
a210: 6c 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20  lt==regOrig );. 
a220: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
a230: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
a240: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
a250: 69 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20  ixReg, regOrig, 
a260: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
a270: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a280: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
a290: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a2a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
a2d0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
a2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a2f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a300: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a310: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a320: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a330: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
a340: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
a350: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a360: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
a370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a380: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a390: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
a3a0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
a3b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a3c0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
a3d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a3e0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
a3f0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
a400: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
a410: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
a420: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
a430: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
a440: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
a450: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
a460: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
a470: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
a480: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
a490: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
a4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a4b0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a4c0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a4d0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
a4e0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
a4f0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
a500: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
a510: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
a520: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
a530: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
a540: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
a550: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
a560: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
a570: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
a580: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
a590: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
a5a0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
a5b0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
a5c0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
a5d0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a5e0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a5f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a600: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
a610: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
a620: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a630: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a640: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a650: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a660: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
a680: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
a690: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
a6a0: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
a6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6c0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a6d0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
a6e0: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
a6f0: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
a700: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
a710: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a730: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a740: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a750: 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  1, regResult, nR
a760: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a770: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a780: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a790: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
a7a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a7b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
a7c0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
a7d0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
a7e0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
a7f0: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
a800: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
a810: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
a820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a830: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
a840: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
a850: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
a860: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
a870: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
a880: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
a890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a8a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
a8b0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
a8c0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
a8d0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
a8e0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
a8f0: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
a900: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
a910: 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20  y cell or array 
a920: 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  of .    ** memor
a930: 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61  y cells and brea
a940: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61  k out of the sca
a950: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
a960: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a970: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a980: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a990: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
a9a0: 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  <=pDest->nSdst )
a9b0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
a9c0: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
a9d0: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
a9e0: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
a9f0: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
aa00: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
aa10: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
aa20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aa30: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44  ( nResultCol==pD
aa40: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
aa50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
aa60: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
aa70: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
aa80: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
aa90: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
aaa0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
aab0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
aac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
aad0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aaf0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
ab00: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
ab10: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
ab20: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
ab30: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
ab40: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
ab50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
ab60: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
ab70: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ab80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ab90: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
aba0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
abb0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
abc0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
abd0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
abe0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
abf0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
ac00: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
ac10: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72               nPr
ac30: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
ac40: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
ac50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
ac60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ac70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ac80: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
ac90: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
aca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
acb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
acc0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
acd0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
ace0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
acf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad00: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ad10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
ad20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
ad30: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
ad40: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
ad50: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
ad60: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
ad70: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
ad80: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
ad90: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
ada0: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
adb0: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
adc0: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
add0: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
ade0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
adf0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
ae00: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
ae10: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
ae20: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
ae30: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
ae40: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
ae50: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
ae60: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
ae70: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
ae80: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
ae90: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
aea0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
aeb0: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
aec0: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
aed0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
aee0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
aef0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
af00: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
af10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
af20: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
af30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
af40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
af50: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
af60: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
af70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
af80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
af90: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
afa0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
afb0: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
afc0: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
afd0: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
afe0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
aff0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b000: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
b010: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
b020: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
b030: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
b040: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
b050: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
b060: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
b070: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
b080: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
b090: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
b0a0: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
b0b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
b0c0: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
b0d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b0e0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
b0f0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b130: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
b140: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b170: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b180: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
b190: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
b1a0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
b1b0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
b1c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b1e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
b1f0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
b200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b210: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
b220: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
b230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b240: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
b250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b270: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
b2a0: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
b2b0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
b2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2d0: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
b2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b300: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
b310: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
b320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b340: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
b350: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
b360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b370: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b380: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
b390: 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29   r1, r2, nKey+2)
b3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
b3b0: 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64  Test ) sqlite3Vd
b3c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b3d0: 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73  drTest);.      s
b3e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
b400: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b410: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
b420: 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79  pParse, r2, nKey
b430: 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +2);.      break
b440: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
b450: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
b460: 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  E */....#if !def
b470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b480: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
b490: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
b4a0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
b4b0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
b4c0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
b4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
b4e0: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
b4f0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
b500: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
b510: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
b520: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
b530: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
b540: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
b550: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
b560: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
b570: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
b580: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
b590: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
b5a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b5b0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
b5c0: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
b5d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b5e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
b5f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b600: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
b610: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  IT is reached.  
b620: 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20  Except, if.  ** 
b630: 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65  there is a sorte
b640: 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  r, in which case
b650: 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20   the sorter has 
b660: 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a  already limited.
b670: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20    ** the output 
b680: 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69  for us..  */.  i
b690: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70  f( pSort==0 && p
b6a0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
b6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6c0: 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
b6d0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
b6e0: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
b6f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
b700: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
b710: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b720: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
b730: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
b740: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
b750: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
b760: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
b770: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
b780: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
b790: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
b7a0: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e   int nExtra = (N
b7b0: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
b7c0: 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f  Seq*)+1) - sizeo
b7d0: 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b  f(CollSeq*);.  K
b7e0: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
b7f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b800: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49  (db, sizeof(KeyI
b810: 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  nfo) + nExtra);.
b820: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
b830: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
b840: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
b850: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46  X];.    p->nKeyF
b860: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
b870: 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20     p->nAllField 
b880: 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20  = (u16)(N+X);.  
b890: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
b8a0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
b8b0: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
b8c0: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
b8d0: 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61  &p[1], 0, nExtra
b8e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b8f0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
b900: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
b910: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
b920: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
b930: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
b940: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
b950: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
b960: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
b970: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
b980: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
b990: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
b9a0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
b9b0: 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62  e3DbFreeNN(p->db
b9c0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
b9d0: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
b9e0: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
b9f0: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
ba00: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
ba10: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
ba20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
ba30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
ba40: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
ba50: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
ba60: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
ba70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ba80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ba90: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
baa0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
bab0: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
bac0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
bad0: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
bae0: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
baf0: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
bb00: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
bb10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb20: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
bb30: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
bb40: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
bb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
bb60: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
bb70: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
bb80: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
bb90: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bba0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
bbb0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
bbc0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
bbd0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
bbe0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bbf0: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
bc00: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bc10: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
bc20: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
bc30: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
bc40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
bc50: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
bc60: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
bc70: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
bc80: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
bc90: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
bca0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
bcb0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
bcc0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
bcd0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
bce0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
bcf0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bd00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
bd10: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
bd20: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
bd30: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bd40: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bd50: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bd60: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
bd70: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
bd80: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
bd90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
bda0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bdb0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
bdc0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
bdd0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
bde0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
bdf0: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
be00: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
be10: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
be20: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 4b  y.** freed..*/.K
be30: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
be40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
be50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
be60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
be70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
be80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
be90: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
bea0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
beb0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
bec0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
bed0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
bee0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
bef0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
bf00: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
bf10: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
bf20: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
bf30: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
bf40: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
bf50: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
bf60: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
bf70: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
bf80: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
bf90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bfa0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
bfb0: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
bfc0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
bfd0: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
bfe0: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
bff0: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
c000: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
c010: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c020: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
c030: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
c040: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
c050: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
c060: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
c070: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
c080: 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  +){.      pInfo-
c090: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
c0a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
c0b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c0c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
c0d0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
c0e0: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
c0f0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
c100: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
c110: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
c120: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
c130: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
c140: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
c150: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
c170: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
c180: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
c190: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
c1a0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
c1b0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
c1c0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
c1d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
c1e0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c1f0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
c200: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
c210: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
c220: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
c230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c240: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
c250: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
c260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
c270: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
c280: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c290: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
c2a0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
c2b0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
c2c0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
c2d0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
c2f0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
c300: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
c310: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
c320: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
c330: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
c340: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
c350: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c360: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
c370: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
c380: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
c390: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
c3a0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
c3b0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
c3c0: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
c3d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
c3e0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
c3f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c400: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
c410: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
c420: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
c430: 7a 55 73 61 67 65 29 7b 0a 20 20 45 78 70 6c 61  zUsage){.  Expla
c440: 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
c450: 72 73 65 2c 20 30 2c 20 22 55 53 45 20 54 45 4d  rse, 0, "USE TEM
c460: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
c470: 2c 20 7a 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f  , zUsage));.}../
c480: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
c490: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
c4a0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
c4b0: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
c4c0: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
c4d0: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
c4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c4f0: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
c500: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c510: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
c520: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
c530: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
c540: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
c550: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
c560: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
c570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c580: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
c590: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
c5a0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
c5b0: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
c5c0: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
c5d0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c5e0: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
c5f0: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
c600: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
c610: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
c620: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
c630: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
c640: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
c650: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
c660: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
c670: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
c680: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
c690: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
c6a0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
c6b0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
c6c0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
c6d0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
c6e0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
c6f0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
c700: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
c710: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
c720: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
c730: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
c740: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
c750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
c760: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
c770: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
c780: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
c790: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
c7a0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
c7b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c7e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
c7f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c800: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
c810: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
c820: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
c830: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c840: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
c850: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
c860: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
c870: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
c880: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
c890: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
c8a0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
c8b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c8c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
c8f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
c900: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
c910: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
c920: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
c930: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
c940: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
c950: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
c960: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c970: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
c980: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
c990: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
c9a0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
c9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c9c0: 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70  p of output loop
c9d0: 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e  . Jump for Next.
c9e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e   */.  int addrOn
c9f0: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ca00: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
ca10: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
ca20: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ca30: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ca40: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
ca50: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ca60: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ca70: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
ca80: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
ca90: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
cac0: 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f  ey columns in so
cad0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
cae0: 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20   int iSortTab;  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f   /* Sorter curso
cb10: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
cb20: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
cb30: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb50: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
cb60: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
cb70: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74  eq. no. */.  int
cb80: 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20   nRefKey = 0;.  
cb90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cba0: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
cbb0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
cbc0: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
cbd0: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
cbe0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
cbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cc00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cc10: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
cc20: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
cc30: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
cc40: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
cc50: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
cc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
cc80: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
cc90: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
cca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
ccb0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 2f  R_REFERENCES.  /
ccc0: 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72 73 6f  * Open any curso
ccd0: 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20 73 6f  rs needed for so
cce0: 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 65  rter-reference e
ccf0: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
cd00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
cd10: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
cd20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
cd30: 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  = pSort->aDefer[
cd40: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  i].pTab;.    int
cd50: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cd60: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
cd70: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
cd80: 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
cd90: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
cda0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66  rse, pSort->aDef
cdb0: 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c  er[i].iCsr, iDb,
cdc0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
cdd0: 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79  ad);.    nRefKey
cde0: 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20   = MAX(nRefKey, 
cdf0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce00: 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  .nKey);.  }.#end
ce10: 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70 53 6f  if..  iTab = pSo
ce20: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
ce30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ce40: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
ce50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
ce60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
ce70: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
ce80: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
ce90: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
cea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
ceb0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
cec0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ced0: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
cee0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
cef0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
cf00: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  umn);.  }.  nKey
cf10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cf20: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cf30: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cf40: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cf50: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cf60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
cf70: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
cf80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
cf90: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
cfa0: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
cfb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cfc0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
cfd0: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
cfe0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
cff0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d000: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d020: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d030: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d040: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d050: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d060: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d070: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d080: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d090: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d0a0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d0c0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d0d0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d0e0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d0f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d100: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d110: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d120: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d140: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d150: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d160: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d170: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d180: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d190: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d1a0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d1b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d1c0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d1d0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d1e0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1f0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d200: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d210: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d220: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d230: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d240: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d250: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d260: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d270: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d280: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d290: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d2a0: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d2b0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d2c0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d2d0: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d2e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d2f0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d300: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d310: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d320: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d330: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d340: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d350: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d360: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d370: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d380: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d390: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d3a0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d3b0: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d3c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d3d0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d3e0: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d3f0: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d400: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d420: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d430: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d440: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d450: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d470: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d480: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d490: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4b0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d4c0: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d4f0: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d510: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d520: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d530: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d540: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d550: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d560: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d570: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d580: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d5b0: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d5c0: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d5e0: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d5f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d600: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d610: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d620: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d630: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d640: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d660: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d670: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d680: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d6b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d6c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d6e0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d6f0: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d700: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d710: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d720: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d740: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d750: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d760: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d770: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d780: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d790: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d7a0: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d7c0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d7d0: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d7e0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d7f0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d800: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d810: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d820: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d840: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d850: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d870: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d880: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d890: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d8a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d8b0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d8c0: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d8d0: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d8e0: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d8f0: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d900: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d910: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d920: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d930: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d950: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
d960: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
d970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d990: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
d9a0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
d9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
d9d0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
d9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
da00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
da10: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
da20: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
da30: 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65   nColumn==sqlite
da40: 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d  3Strlen30(pDest-
da50: 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20  >zAffSdst) );.  
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
da80: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
da90: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69  nColumn, regRowi
daa0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
dab0: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
dac0: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c  ->zAffSdst, nCol
dad0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
dae0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
daf0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
db00: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
db10: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db20: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
db30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db40: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
db50: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
db60: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
db70: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
db80: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
db90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
dba0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
dbb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
dbc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
dbd0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
dbe0: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
dbf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
dc00: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
dc10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
dc20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
dc30: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
dc40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
dc50: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
dc60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc70: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
dc80: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
dc90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcc0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
dcd0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
dce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd00: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
dd10: 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  {.    if( eDest=
dd20: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
dd30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd40: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
dd50: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
dd60: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
dd70: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dd80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dd90: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
dda0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
ddb0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ddc0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
ddd0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
dde0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
ddf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
de00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
de10: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
de20: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
de30: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
de40: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
de50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de60: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
de70: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
de80: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
de90: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
dea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
deb0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dec0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
ded0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dee0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
def0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
df00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
df10: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
df20: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
df30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
df40: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
df50: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
df60: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
df70: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
df80: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
df90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
dfa0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
dfb0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
dfc0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
dfd0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
dfe0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
dff0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
e000: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
e010: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
e020: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
e030: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
e040: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
e050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
e060: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
e070: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
e080: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
e090: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
e0a0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
e0b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e0c0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
e0d0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e0e0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
e0f0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
e100: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
e110: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
e120: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
e130: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
e140: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
e150: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
e160: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
e170: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
e180: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
e190: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
e1a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e1b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e1c0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
e1d0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
e1e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e1f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
e200: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e210: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e220: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
e230: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
e240: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
e250: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
e260: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
e270: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
e280: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
e290: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e2a0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
e2b0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
e2c0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
e2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e2e0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
e2f0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
e300: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
e310: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
e320: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
e330: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e340: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
e350: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
e360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e370: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e380: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
e390: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e3a0: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e3b0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23  mpl(A,B,C,D,E).#
e3c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
e3d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
e3e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e3f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
e400: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e410: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e420: 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a  mpl(A,B).#endif.
e430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e440: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
e450: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
e460: 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20   *pNC, .#ifndef 
e470: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e480: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e490: 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73  Expr *pExpr.#els
e4a0: 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  e.  Expr *pExpr,
e4b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e4c0: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
e4d0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
e4e0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
e4f0: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e   **pzOrigCol.#en
e500: 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dif.){.  char co
e510: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
e520: 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20    int j;.#ifdef 
e530: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e540: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e550: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
e560: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
e570: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
e580: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e590: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
e5a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
e5b0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e5c0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
e5d0: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61  rcList!=0 );.  a
e5e0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e5f0: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
e600: 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  );  /* This rout
e610: 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65  ine runes before
e620: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20   aggregates.    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
e660: 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  sed */.  switch(
e670: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e680: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
e690: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e6b0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
e6c0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
e6d0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
e6e0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
e6f0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
e700: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
e710: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
e720: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
e730: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
e740: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
e750: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
e760: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
e770: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e780: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
e790: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e7a0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
e7b0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e7d0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
e7e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e7f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
e800: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
e810: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
e820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
e830: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
e840: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
e850: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
e860: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
e870: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
e880: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
e890: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
e8a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
e8b0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
e8c0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
e8d0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
e8e0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
e8f0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
e900: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
e910: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
e920: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e930: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
e940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e950: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
e960: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e970: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e980: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
e990: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
e9a0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
e9b0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
e9c0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
e9d0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
e9e0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
e9f0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
ea00: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
ea10: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
ea20: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
ea30: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
ea40: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
ea50: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ea60: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
ea70: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
ea80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
ea90: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
eaa0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
eab0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
eac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
ead0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eae0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
eaf0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
eb00: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
eb10: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
eb20: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
eb30: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
eb50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eb60: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eb70: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
eb80: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
eb90: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
eba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ebb0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
ebc0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
ebd0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
ebe0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
ebf0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
ec00: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
ec10: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
ec20: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
ec30: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
ec40: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
ec50: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
ec60: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
ec70: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
ec80: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
ec90: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
eca0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
ecb0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
ecc0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
ecd0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
ece0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
ecf0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
ed00: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ed10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed20: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ed30: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3d 3d   pExpr->y.pTab==
ed40: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
ed50: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
ed60: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
ed70: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
ed80: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
ed90: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
eda0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
edb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
edc0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
edd0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
ede0: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
edf0: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
ee00: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
ee10: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
ee20: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
ee30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ee40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
ee50: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
ee60: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
ee70: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
ee80: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
ee90: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
eea0: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
eeb0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
eec0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
eed0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
eee0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
eef0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
ef00: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
ef10: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
ef20: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
ef30: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
ef40: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ef50: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
ef60: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
ef70: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
ef80: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
ef90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
efa0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
efb0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
efc0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
efd0: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
efe0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
eff0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
f000: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
f010: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
f020: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
f030: 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20  ,&zOrigCol); .  
f040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f050: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f060: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  A real table or 
f070: 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20  a CTE table */. 
f080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f090: 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pS );.#ifdef SQL
f0a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f0b0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
f0c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
f0d0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
f0e0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
f0f0: 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  rt( iCol==XN_ROW
f100: 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  ID || (iCol>=0 &
f110: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
f120: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
f130: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
f140: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
f150: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
f160: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72     zOrigCol = "r
f170: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
f180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f190: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
f1a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f1b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
f1c0: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
f1d0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
f1e0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
f1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
f200: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
f220: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26  f( pNC->pParse &
f230: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  & pTab->pSchema 
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f250: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f260: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
f270: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
f280: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
f290: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
f2a0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
f2b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
f2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
f2d0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73 73  else.        ass
f2e0: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
f2f0: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
f300: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
f310: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
f320: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
f330: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
f340: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
f350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f360: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f370: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f380: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f390: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
f3a0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
f3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
f3e0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
f3f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
f400: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
f410: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
f420: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
f430: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
f440: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
f450: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
f460: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
f470: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
f480: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
f490: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
f4a0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
f4b0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
f4c0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
f4d0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
f4e0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
f4f0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
f500: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
f510: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
f520: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
f530: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
f540: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
f550: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
f560: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f570: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
f580: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
f590: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
f5a0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f5b0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
f5c0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
f5d0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
f5e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f5f0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
f600: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f610: 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69  N_METADATA  .  i
f620: 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20  f( pzOrigDb ){. 
f630: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
f640: 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f  gTab && pzOrigCo
f650: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
f660: 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20  Db = zOrigDb;.  
f670: 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a    *pzOrigTab = z
f680: 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a  OrigTab;.    *pz
f690: 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43  OrigCol = zOrigC
f6a0: 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ol;.  }.#endif. 
f6b0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
f6c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f6d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f6e0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
f6f0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
f700: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
f710: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
f720: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
f730: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
f740: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
f750: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
f760: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
f770: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
f780: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
f790: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
f7a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
f7b0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
f7c0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
f7d0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
f7e0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
f7f0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
f800: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f810: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f820: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
f830: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
f840: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
f850: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
f860: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e  pParse;.  sNC.pN
f870: 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ext = 0;.  for(i
f880: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
f890: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
f8a0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
f8b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
f8d0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
f8e0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f8f0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
f900: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
f910: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
f920: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
f930: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f940: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
f950: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
f960: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f970: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f980: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f990: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
f9a0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
f9b0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
f9c0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
f9d0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
f9e0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
f9f0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
fa00: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
fa10: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
fa20: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
fa30: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
fa40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
fa50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
fa60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fa70: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
fa80: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
fa90: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
faa0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fab0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fac0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
fad0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fae0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
faf0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
fb00: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
fb10: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
fb20: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fb30: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
fb40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fb50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
fb60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
fb70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb90: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
fba0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fbb0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
fbc0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
fbd0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
fbe0: 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ) */.}.../*.** C
fbf0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
fc00: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45  n names for a SE
fc10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
fc20: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
fc30: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
fc40: 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
fc50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
fc60: 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
fc70: 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
fc80: 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
fc90: 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
fca0: 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
fcb0: 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
fcc0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
fcd0: 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
fce0: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
fcf0: 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
fd00: 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
fd10: 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
fd20: 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
fd30: 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
fd40: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd50: 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
fd60: 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
fd70: 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
fd80: 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
fd90: 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
fda0: 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
fdb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
fdc0: 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
fdd0: 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
fde0: 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f   Also: sqlite3Co
fdf0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
fe00: 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52  t().**.** The PR
fe10: 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d  AGMA short_colum
fe20: 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47  n_names and PRAG
fe30: 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  MA full_column_n
fe40: 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61 72  ames settings ar
fe50: 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e  e.** deprecated.
fe60: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 65    The default se
fe70: 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f  tting is short=O
fe80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39  N, full=OFF.  99
fe90: 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70  .9% of all.** ap
fea0: 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c  plications shoul
feb0: 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20 77  d operate this w
fec0: 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ay.  Nevertheles
fed0: 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75  s, we need to su
fee0: 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68  pport the.** oth
fef0: 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67  er modes for leg
ff00: 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68  acy:.**.**    sh
ff10: 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46  ort=OFF, full=OF
ff20: 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  F:      Column n
ff30: 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74 20  ame is the text 
ff40: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ff50: 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20  n has it.**     
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61           origina
ff80: 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20 74  lly appears in t
ff90: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ffa0: 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20  ent.  In.**     
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 77           other w
ffd0: 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20  ords, the zSpan 
ffe0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65 78  of the result ex
fff0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
10000 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c     short=ON, ful
10010 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68  l=OFF:       (Th
10020 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
10030 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20  t setting).  If 
10040 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72             refer
10070 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20  s directly to a 
10080 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  table column, th
10090 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  en the.**       
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f         result co
100c0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73  lumn name is jus
100d0 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  t the table colu
100e0 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  mn.**           
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e     name: COLUMN.
10110 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20    Otherwise use 
10120 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  zSpan..**.**    
10130 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41  full=ON, short=A
10140 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68 65  NY:       If the
10150 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20 64   result refers d
10160 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10170 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20  le column,.**   
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20             then 
101a0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
101b0 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  n name with the 
101c0 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
101f0 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c  x, ex: TABLE.COL
10200 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10210 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74  use zSpan..*/.st
10220 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
10230 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
10240 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10250 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
10260 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10270 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
10280 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75  /* Generate colu
10290 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  mn names for thi
102a0 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
102b0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
102c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
102d0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54  be;.  int i;.  T
102e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72  able *pTab;.  Sr
102f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
10300 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
10310 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
10320 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10330 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b  .  int fullName;
10340 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c      /* TABLE.COL
10350 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
10360 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69 72  use and is a dir
10370 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f  ect table ref */
10380 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20  .  int srcName; 
10390 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72      /* COLUMN or
103a0 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66   TABLE.COLUMN if
103b0 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e   no AS clause an
103c0 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a  d is direct */..
103d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103e0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
103f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
10400 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
10410 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
10420 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
10450 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
10460 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  sSet ) return;. 
10470 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
10480 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20   are determined 
10490 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  by the left-most
104a0 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
104b0 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20  und select */.  
104c0 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
104d0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
104e0 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
104f0 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43  or;.  SELECTTRAC
10500 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65  E(1,pParse,pSele
10510 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20  ct,("generating 
10520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29  column names\n")
10530 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  );.  pTabList = 
10540 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
10550 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
10560 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
10570 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
10580 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21  ssert( pTabList!
10590 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
105a0 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
105b0 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64  .  fullName = (d
105c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
105d0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
105e0 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20  =0;.  srcName = 
105f0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
10600 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
10610 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d  s)!=0 || fullNam
10620 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
10630 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
10640 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
10650 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
10660 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10670 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
10680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10690 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
106a0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
106b0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  t( p->op!=TK_AGG
106c0 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41  _COLUMN );  /* A
106d0 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61  gg processing ha
106e0 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f  s not run yet */
106f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10700 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
10710 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30 20 29 3b   p->y.pTab!=0 );
10720 20 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78   /* Covering idx
10730 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a   not yet coded *
10740 2f 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  /.    if( pEList
10750 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
10760 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63        /* An AS c
10770 6c 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b  lause always tak
10780 65 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74  es first priorit
10790 79 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  y */.      char 
107a0 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
107b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
107d0 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
107e0 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
107f0 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
10800 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
10810 20 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20   if( srcName && 
10820 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
10830 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
10840 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
10850 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
10860 6e 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  n;.      pTab = 
10870 70 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  p->y.pTab;.     
10880 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
10890 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
108a0 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
108b0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
108c0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
108d0 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
108e0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
108f0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
10900 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
10910 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
10920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10930 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
10940 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
10950 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
10960 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20     if( fullName 
10970 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
10980 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
10990 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
109a0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
109b0 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
109c0 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
109d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
109e0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
109f0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
10a00 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
10a10 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
10a20 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10a30 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10a40 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10a50 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
10a60 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
10a70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10a80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10a90 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
10aa0 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
10ab0 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
10ac0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10ad0 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
10ae0 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
10af0 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
10b00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10b10 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10b20 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
10b30 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
10b40 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
10b50 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
10b60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
10b70 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
10b80 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
10b90 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
10ba0 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
10bb0 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
10bc0 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
10bd0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10be0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
10bf0 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
10c00 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
10c10 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
10c20 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
10c30 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
10c40 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
10c50 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
10c60 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
10c70 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
10c80 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10c90 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
10ca0 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
10cb0 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
10cc0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
10cd0 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
10ce0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
10cf0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10d00 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
10d10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
10d20 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
10d30 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
10d40 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
10d50 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
10d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a  SQLITE_NOMEM..**
10d70 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
10d80 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
10d90 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
10da0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
10db0 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
10dc0 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
10dd0 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
10de0 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
10df0 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
10e00 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
10e10 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
10e20 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
10e30 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
10e40 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
10e50 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
10e60 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
10e70 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
10e80 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
10e90 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
10ea0 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
10eb0 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
10ec0 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
10ed0 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
10ee0 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
10ef0 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
10f00 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
10f10 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
10f20 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
10f30 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c  lso: generateCol
10f40 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e  umnNames().*/.in
10f50 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
10f60 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
10f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10f80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10f90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10fa0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10fb0 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
10fc0 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
10fd0 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
10fe0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
10ff0 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
11000 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11010 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
11020 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
11030 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
11040 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11050 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
11060 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
11070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11080 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
11090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
110a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
110d0 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
110e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
11100 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
11110 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
11120 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
11130 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
11140 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11150 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
11160 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11190 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
111a0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61  ult set */.  cha
111b0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
111d0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
111e0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11200 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
11210 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
11220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11230 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
11240 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
11250 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
11260 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
11270 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
11280 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
11290 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
112a0 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
112b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
112c0 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
112d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
112e0 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20   aCol==0 );.    
112f0 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29  if( nCol>32767 )
11300 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20   nCol = 32767;. 
11310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
11320 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
11330 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
11340 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f  ( nCol==(i16)nCo
11350 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  l );.  *pnCol = 
11360 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
11370 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
11380 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
11390 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nCol && !db->mal
113a0 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20  locFailed; i++, 
113b0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
113c0 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
113d0 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
113e0 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
113f0 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
11400 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
11410 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
11420 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
11430 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
11440 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
11450 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
11460 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65  e name */.    }e
11470 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
11480 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69  *pColExpr = sqli
11490 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
114a0 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
114b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 77 68  pExpr);.      wh
114c0 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
114d0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
114e0 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
114f0 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
11500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11510 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
11520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11530 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d  ssert( pColExpr-
11540 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
11550 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
11560 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11570 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
11580 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
11590 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
115a0 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
115b0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
115c0 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
115d0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
115e0 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
115f0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
11600 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11610 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11620 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11630 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11640 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11650 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11660 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11670 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11690 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
116a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
116c0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
116d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116e0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
116f0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11710 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11720 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11730 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11740 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11750 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11760 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11770 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11780 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11790 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
117a0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
117c0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
117d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
117e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
117f0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11810 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11820 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11830 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11840 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11850 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11860 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11870 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11880 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11890 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
118a0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118b0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
118c0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
118d0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
118e0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
118f0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11900 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11920 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11930 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11940 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11950 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11960 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11970 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11980 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11990 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
119a0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119b0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
119c0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
119d0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
119e0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
119f0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
11a00 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a10 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a30 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a40 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a50 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11a60 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11a70 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11a80 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11a90 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11aa0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11ab0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11ac0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ae0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11af0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11b00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b10 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b30 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b40 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b50 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11b60 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11b90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11ba0 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11bb0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11bc0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11bd0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11be0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11bf0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11c00 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c10 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c20 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c30 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c40 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c50 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11c60 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11c70 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11c80 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11c90 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11ca0 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11cb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cd0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11ce0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11cf0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11d00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d10 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d20 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d30 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d40 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11d60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11d70 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11d80 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11d90 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11da0 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11db0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11dc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11dd0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11de0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11df0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11e00 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
11e10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
11e30 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
11e40 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
11e50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11e60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
11e70 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
11e80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
11e90 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
11ea0 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
11eb0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
11ec0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
11ed0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
11ee0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
11ef0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
11f00 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
11f10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11f20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11f30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11f40 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
11f50 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
11f60 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
11f70 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
11f80 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
11f90 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
11fa0 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
11fb0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
11fc0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
11fd0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11fe0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
11ff0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
12000 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12010 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12020 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12030 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12040 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12050 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12060 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12070 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12080 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12090 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
120a0 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
120b0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
120c0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
120d0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
120e0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
120f0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
12100 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12110 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12120 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12130 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12140 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12150 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12160 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12170 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12180 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12190 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
121a0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
121b0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
121c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
121e0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
121f0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
12200 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12210 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12220 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12230 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12240 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12250 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12260 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12270 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12280 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
122a0 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
122b0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
122c0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
122d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
122e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122f0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
12300 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12310 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12320 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12330 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12340 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12350 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12360 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12370 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12380 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12390 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
123a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
123b0 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
123c0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
123d0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
123e0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
123f0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
12400 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12410 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
12420 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
12430 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
12440 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
12450 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12460 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
12470 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
12480 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
12490 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
124a0 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
124b0 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
124c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
124d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
124e0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
124f0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
12500 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12510 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
12520 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12530 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
12540 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
12550 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
12560 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
12570 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
12580 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
12590 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
125a0 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
125b0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
125c0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
125d0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
125e0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
125f0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
12600 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
12610 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12620 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
12630 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
12640 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
12650 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12660 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12670 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12680 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
12690 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
126a0 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
126b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
126c0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
126d0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
126e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
126f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
12700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
12710 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
12720 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
12730 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
12740 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
12750 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
12760 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
12770 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
12780 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
12790 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
127a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
127b0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
127c0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
127d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
127e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
127f0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
12800 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
12810 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
12820 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
12830 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
12840 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
12850 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
12860 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
12870 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
12880 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
12890 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
128a0 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
128b0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
128c0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
128d0 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
128e0 0a 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65  .** pLimit expre
128f0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d  ssions.  pLimit-
12900 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69  >pLeft and pLimi
12910 74 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74  t->pRight hold t
12920 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
12930 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
12940 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
12950 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
12960 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
12970 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
12980 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
12990 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
129a0 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
129b0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
129c0 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
129d0 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
129e0 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
129f0 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
12a00 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
12a10 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
12a20 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
12a30 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
12a40 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
12a50 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12a60 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
12a70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12a80 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
12a90 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
12aa0 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
12ab0 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
12ac0 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
12ad0 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e  ined by pLimit->
12ae0 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12af0 2d 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69  ->pRight.  iLimi
12b00 74 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74  t.** and iOffset
12b10 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12b20 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
12b30 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
12b40 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
12b50 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12b60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
12b70 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
12b80 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
12b90 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
12ba0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
12bb0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
12bc0 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
12bd0 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
12be0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12bf0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
12c00 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
12c10 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12c20 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
12c30 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
12c40 74 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74  t->pLeft!=0 do t
12c50 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12c60 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
12c70 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
12c80 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
12c90 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
12ca0 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
12cb0 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
12cc0 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
12cd0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
12ce0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
12cf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12d00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12d10 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
12d20 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
12d30 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12d40 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
12d50 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
12d60 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
12d70 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
12d80 20 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a   int n;.  Expr *
12d90 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12da0 69 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c  it;..  if( p->iL
12db0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
12dc0 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
12dd0 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
12de0 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
12df0 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
12e00 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
12e10 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
12e20 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
12e30 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
12e40 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
12e50 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
12e60 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
12e70 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
12e80 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12e90 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  imit ){.    asse
12ea0 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d  rt( pLimit->op==
12eb0 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TK_LIMIT );.    
12ec0 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12ed0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
12ee0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
12ef0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
12f00 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
12f10 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12f20 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
12f30 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
12f40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12f50 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c  teger(pLimit->pL
12f60 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  eft, &n) ){.    
12f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12f90 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
12fa0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12fb0 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
12fc0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
12fd0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
12fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12ff0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
13000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
13010 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
13020 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
13030 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
13040 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13050 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
13060 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
13070 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
13080 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
13090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
130a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
130b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
130c0 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  e, pLimit->pLeft
130d0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
130e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130f0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
13100 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
13110 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13120 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
13130 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
13140 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13160 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
13170 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
13180 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13190 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d    }.    if( pLim
131a0 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  it->pRight ){.  
131b0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
131c0 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
131d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
131e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
131f0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
13200 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
13210 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
13220 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
13230 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13240 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  e, pLimit->pRigh
13250 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
13260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13270 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
13280 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
13290 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
132a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
132b0 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
132c0 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
132d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
132e0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
132f0 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
13300 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
13310 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13320 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
13330 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
13340 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
13350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13360 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
13370 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
13380 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
13390 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
133a0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
133b0 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
133c0 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
133d0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
133e0 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
133f0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
13400 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
13410 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
13420 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13430 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
13440 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
13450 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
13460 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
13470 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
13480 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
13490 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
134a0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
134b0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
134c0 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
134d0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
134e0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
134f0 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
13500 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
13510 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
13520 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
13530 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13540 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
13550 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
13560 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
13570 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
13580 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
13590 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
135a0 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
135b0 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
135c0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
135d0 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
135e0 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
135f0 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
13600 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
13610 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
13620 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
13630 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
13640 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
13650 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
13660 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
13670 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13680 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
13690 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
136a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
136b0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
136c0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
136d0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
136e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
136f0 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
13700 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13710 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13720 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
13730 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13740 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
13750 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
13760 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
13770 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
13780 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
13790 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
137a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
137b0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
137c0 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
137d0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
137e0 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
137f0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
13800 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
13810 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
13820 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
13830 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
13840 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
13850 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
13860 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13870 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
13880 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13890 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
138a0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
138b0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
138c0 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
138d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
138e0 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
138f0 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
13900 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
13910 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
13920 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
13930 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13940 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
13950 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
13960 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13970 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
13980 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
13990 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
139a0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
139b0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
139c0 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
139d0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
139e0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
139f0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13a00 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a10 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
13a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a30 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13a40 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13a50 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
13a60 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
13a70 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
13a80 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
13a90 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13aa0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
13ab0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13ac0 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
13ad0 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
13ae0 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
13af0 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
13b00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
13b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13b20 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
13b30 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
13b40 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
13b50 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
13b60 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
13b70 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
13b80 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13b90 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13ba0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13bb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13bc0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13be0 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13bf0 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13c00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13c10 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13c20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
13c30 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
13c40 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
13c50 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
13c60 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
13c70 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13ca0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13cb0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13cc0 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13d10 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13d20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13d30 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13d40 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
13d50 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
13d60 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
13d70 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
13d80 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13d90 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13da0 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13db0 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13dc0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13dd0 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13de0 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13df0 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13e00 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13e10 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13e20 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
13e30 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
13e40 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
13e50 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
13e60 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
13e70 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
13e80 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13e90 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13ea0 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13eb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13ec0 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13ed0 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13ee0 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13ef0 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13f00 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13f10 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13f20 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
13f30 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13f40 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
13f50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13f60 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
13f70 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
13f80 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13f90 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13fa0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
13fb0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
13fc0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
13fd0 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
13fe0 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
13ff0 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
14000 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14010 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
14020 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
14030 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
14040 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
14050 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
14060 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
14070 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
14080 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
14090 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
140a0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
140b0 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
140c0 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
140d0 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
140e0 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
140f0 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
14100 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
14110 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
14120 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
14130 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
14140 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
14150 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
14160 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
14170 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
14180 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14190 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
141a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
141b0 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
141c0 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
141d0 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
141e0 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
141f0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
14200 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
14210 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
14220 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
14230 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
14240 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
14250 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
14260 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
14270 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
14280 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
14290 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
142a0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
142b0 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
142c0 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
142d0 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
142e0 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
142f0 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
14300 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
14310 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
14320 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
14330 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
14340 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
14350 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
14360 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
14370 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14380 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14390 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
143a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
143b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
143c0 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
143d0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
143e0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
143f0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
14400 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
14410 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
14420 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
14430 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14440 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14450 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
14460 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
14470 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
14480 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
14490 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
144a0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
144b0 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
144c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
144d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
144e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
144f0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14500 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
14510 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
14520 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
14530 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
14540 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14560 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
14570 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
14580 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
14590 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
145a0 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
145b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
145c0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
145d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
145e0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
145f0 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14610 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14620 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
14630 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
14660 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14670 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
14680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
14690 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
146a0 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
146b0 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
146c0 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
146d0 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
146e0 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
146f0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
14700 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
14710 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
14720 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
14730 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14750 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14760 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
14770 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14790 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
147a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
147b0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
147c0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
147d0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
147e0 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
147f0 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
14800 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14810 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
14820 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
14830 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14840 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
14850 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23  and OFFSET */..#
14860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14870 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
14880 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20  if( p->pWin ){. 
14890 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
148a0 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
148b0 6f 74 20 75 73 65 20 77 69 6e 64 6f 77 20 66 75  ot use window fu
148c0 6e 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 75 72  nctions in recur
148d0 73 69 76 65 20 71 75 65 72 69 65 73 22 29 3b 0a  sive queries");.
148e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
148f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74  #endif..  /* Obt
14900 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
14910 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
14920 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14930 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14940 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14950 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
14960 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14970 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
14980 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14990 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
149a0 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
149b0 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
149c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
149d0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
149e0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
149f0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
14a00 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
14a10 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14a20 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
14a30 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
14a40 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
14a50 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14a60 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
14a70 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
14a80 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
14a90 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
14aa0 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
14ab0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14ac0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
14ad0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14ae0 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
14af0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
14b00 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
14b10 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
14b20 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
14b30 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
14b40 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
14b50 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
14b60 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
14b70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14b80 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14b90 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
14ba0 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
14bb0 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
14bc0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
14bd0 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
14be0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
14bf0 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
14c00 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
14c10 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
14c20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
14c30 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
14c40 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
14c50 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
14c60 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
14c70 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
14c80 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14c90 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14ca0 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
14cb0 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
14cc0 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
14cd0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
14ce0 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
14cf0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14d00 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
14d10 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
14d20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14d30 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
14d40 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
14d50 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14d60 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
14d70 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
14d80 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
14d90 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
14da0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14dc0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
14dd0 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
14de0 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
14df0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14e00 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
14e10 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
14e20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
14e30 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
14e40 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14e50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14e60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14e70 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
14e80 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
14eb0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
14ec0 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
14ed0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
14ee0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
14ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f00 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f10 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
14f20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
14f30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
14f40 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
14f50 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
14f60 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
14f70 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
14f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f90 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14fa0 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
14fb0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
14fc0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14fd0 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
14fe0 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
14ff0 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
15000 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
15010 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
15020 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
15030 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15040 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
15050 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
15060 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15070 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51   = 0;.  ExplainQ
15080 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15090 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a  , 1, "SETUP"));.
150a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
150b0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
150c0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
150d0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
150e0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
150f0 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
15100 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
15110 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
15120 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
15130 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
15140 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
15150 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
15160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15170 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
15180 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
15190 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
151a0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
151b0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
151c0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
151d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
151e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
151f0 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
15200 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
15210 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
15220 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
15230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15240 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15250 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
15260 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
15270 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
15280 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
152a0 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
152b0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
152c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
152d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
152e0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
152f0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
15300 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
15310 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
15320 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15330 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15340 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
15350 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
15360 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
15370 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15380 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20   iCurrent,.     
15390 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64   0, 0, pDest, ad
153a0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
153b0 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d  k);.  if( regLim
153c0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
153d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
153e0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
153f0 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
15400 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
15410 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
15420 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15430 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
15440 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
15450 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
15460 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
15470 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
15480 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
15490 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
154a0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
154b0 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
154c0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
154d0 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ueue..  */.  if(
154e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
154f0 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
15500 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15510 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75  sg(pParse, "recu
15520 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20  rsive aggregate 
15530 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70  queries not supp
15540 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  orted");.  }else
15550 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  {.    p->pPrior 
15560 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e  = 0;.    Explain
15570 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15580 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45  e, 1, "RECURSIVE
15590 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71   STEP"));.    sq
155a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
155b0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
155c0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
155d0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
155e0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
155f0 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
15600 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
15610 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
15620 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
15630 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15640 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
15650 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15660 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15670 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
15680 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
15690 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
156a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
156b0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
156c0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
156d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
156e0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
156f0 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
15700 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15710 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
15720 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
15730 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
15740 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
15750 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
15760 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15770 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15780 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15790 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
157a0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
157b0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
157c0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
157d0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
157e0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
157f0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15800 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
15810 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
15820 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
15830 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
15840 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
15850 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
15860 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
15870 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
15880 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
15890 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
158a0 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
158b0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
158c0 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
158d0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
158e0 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
158f0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
15900 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
15910 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
15920 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
15930 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
15940 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
15950 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
15960 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
15970 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
15980 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
15990 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
159a0 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
159b0 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
159c0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
159d0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
159e0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
159f0 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
15a00 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
15a10 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
15a20 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
15a30 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
15a40 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
15a50 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
15a60 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
15a70 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
15a80 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
15a90 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
15aa0 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
15ab0 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
15ac0 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
15ad0 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
15ae0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
15af0 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
15b00 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
15b10 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15b20 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
15b30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15b40 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15b50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15b60 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15b70 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15b80 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
15b90 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15ba0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15bb0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
15bc0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
15bd0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
15be0 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
15bf0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nt rc = 0;.  int
15c00 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70   bShowAll = p->p
15c10 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65  Limit==0;.  asse
15c20 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15c30 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
15c40 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
15c50 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15c60 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
15c70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
15c80 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
15c90 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
15ca0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
15cb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15cc0 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
15cd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
15ce0 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
15cf0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
15d00 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
15d10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
15d20 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
15d30 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
15d40 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
15d50 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77     nRow += bShow
15d60 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  All;.  }while(1)
15d70 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
15d80 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
15d90 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41   "SCAN %d CONSTA
15da0 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c  NT ROW%s", nRow,
15db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15dc0 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22       nRow==1 ? "
15dd0 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69  " : "S"));.  whi
15de0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c  le( p ){.    sel
15df0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15e00 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
15e10 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a  , pDest, 1, 1);.
15e20 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c      if( !bShowAl
15e30 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  l ) break;.    p
15e40 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
15e50 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
15e60 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
15e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15e80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15e90 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
15ea0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
15eb0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
15ec0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
15ed0 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
15ee0 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
15ef0 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
15f00 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
15f10 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
15f20 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
15f30 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
15f40 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
15f50 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
15f60 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
15f70 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
15f80 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
15f90 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
15fa0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
15fb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
15fc0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
15fd0 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
15fe0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
15ff0 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
16000 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16010 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
16020 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
16030 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
16040 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
16050 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
16060 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
16070 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
16080 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
16090 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
160a0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
160b0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
160c0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
160d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
160e0 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
160f0 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
16100 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
16110 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
16120 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
16130 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
16140 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
16150 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
16160 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
16170 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
16180 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
16190 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
161a0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
161b0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
161c0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
161d0 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
161e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
161f0 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
16200 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
16210 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
16220 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
16230 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
16240 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
16250 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
16260 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
16270 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
16280 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
16290 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
162a0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
162b0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
162c0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
162d0 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
162e0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
162f0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
16300 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
16310 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16320 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16340 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
16350 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
16360 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
16370 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
16380 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
16390 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
163a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
163b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
163c0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
163d0 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
163e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
163f0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
16400 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
16410 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
16420 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
16430 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16440 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16450 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
16460 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
16470 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
16480 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
16490 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
164a0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
164b0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
164c0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
164d0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
164e0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
164f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16500 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
16510 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16520 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
16530 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
16540 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
16550 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
16560 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
16570 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
16580 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
16590 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
165a0 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
165b0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
165c0 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
165d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
165e0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
165f0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
16600 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
16610 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
16620 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
16630 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
16640 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
16650 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
16660 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
16670 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
16680 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
16690 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
166a0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
166b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
166c0 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
166d0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
166e0 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
166f0 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
16700 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
16710 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
16720 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
16730 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
16740 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
16750 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16760 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
16770 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16780 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16790 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
167a0 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
167b0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
167c0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
167d0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
167e0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
167f0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
16800 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
16810 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
16820 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
16830 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16840 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
16850 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16860 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16870 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
16880 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
16890 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
168a0 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
168b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
168c0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
168d0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
168e0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
168f0 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
16900 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
16910 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16920 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
16930 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
16940 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
16950 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16960 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16970 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16980 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
16990 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
169a0 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
169b0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
169c0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
169d0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
169e0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
169f0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
16a00 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
16a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16a20 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
16a30 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
16a40 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
16a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
16a60 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
16a70 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16a80 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
16a90 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
16aa0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
16ab0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
16ac0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
16ad0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
16ae0 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
16af0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
16b00 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
16b10 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
16b20 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16b30 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
16b40 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
16b50 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
16b60 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20  }else{..#ifndef 
16b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16b80 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69  AIN.    if( pPri
16b90 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
16ba0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
16bb0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16bc0 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55   1, "COMPOUND QU
16bd0 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78  ERY"));.      Ex
16be0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16bf0 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
16c00 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29  -MOST SUBQUERY")
16c10 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16c20 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
16c30 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
16c40 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
16c50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
16c60 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63      */.    switc
16c70 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
16c80 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
16c90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
16ca0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
16cb0 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
16cc0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
16cd0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
16ce0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
16cf0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
16d00 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
16d10 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
16d20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
16d30 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
16d40 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16d60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16d70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
16d80 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
16d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16da0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
16db0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16dc0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
16dd0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
16de0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
16df0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
16e00 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
16e10 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
16e20 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
16e30 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
16e40 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
16e50 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
16e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e70 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e  v, OP_IfNot, p->
16e80 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
16e90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
16ea0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16eb0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
16ec0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
16ed0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  "));.          i
16ee0 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
16ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16f10 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
16f50 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
16f60 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
16f70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16f80 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16f90 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16fa0 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a   "UNION ALL"));.
16fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16fc0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16fd0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16fe0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17000 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17010 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17020 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17030 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
17040 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
17050 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17060 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
17070 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
17080 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69  tRow);.        i
17090 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
170a0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  t.         && sq
170b0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
170c0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
170d0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
170e0 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  t).         && n
170f0 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
17100 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
17110 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
17120 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29  imit) .        )
17130 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
17140 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
17150 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
17160 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
17170 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  }.        if( ad
17180 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
17190 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
171a0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
171b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
171c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
171d0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
171e0 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EPT:.      case 
171f0 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
17200 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
17210 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
17220 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
17230 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  p table holding 
17240 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
17250 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
17260 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
17270 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
17280 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
17290 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  f */.        int
172a0 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
172b0 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
172c0 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
172d0 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
172e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
172f0 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76  Limit;    /* Sav
17300 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
17310 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20  nLimit  */.     
17320 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
17330 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17340 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20  uniondest;.  .  
17350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17360 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
17370 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17380 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17390 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
173a0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
173b0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  nion;.        if
173c0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
173d0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
173e0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
173f0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
17400 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
17410 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
17420 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  r.          ** r
17430 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ight..          
17440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
17450 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
17460 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
17470 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
17480 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
17490 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
174a0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
174b0 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rm;.        }els
174c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
174d0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
174e0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
174f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
17500 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
17510 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
17520 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
17530 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17540 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
17550 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17560 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17570 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
17580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   );.          ad
17590 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
175a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
175b0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
175c0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
175d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
175e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
175f0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
17600 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
17610 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
17620 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
17630 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
17640 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
17650 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  meral;.         
17660 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17670 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
17680 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17690 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
176a0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
176b0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  left.        */.
176c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
176d0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
176e0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
176f0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17700 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
17710 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
17720 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17730 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17740 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
17750 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17760 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
17770 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
17780 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
17790 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
177a0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
177b0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
177c0 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
177d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
177e0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
177f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  ){.          op 
17800 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
17810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17830 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
17840 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  ;.          op =
17850 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
17860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
17870 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
17880 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
17890 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
178a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
178b0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73          uniondes
178c0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
178d0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
178e0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
178f0 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
17900 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
17930 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
17940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17950 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17960 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
17970 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17990 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;.        /* Que
179a0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
179b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
179c0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
179d0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
179e0 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
179f0 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
17a00 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
17a10 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
17a20 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
17a30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
17a40 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
17a50 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
17a60 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
17a70 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17a80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17a90 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17aa0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
17ab0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
17ac0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
17ad0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
17ae0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
17af0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
17b00 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
17b10 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
17b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17b30 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
17b40 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17b50 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17b60 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
17b70 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
17b80 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
17b90 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20  fset = 0;.  .   
17ba0 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
17bb0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
17bc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17bd0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
17be0 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rm.        ** it
17bf0 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
17c00 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
17c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17c20 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
17c30 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
17c40 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
17c50 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20  orOp );.        
17c60 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
17c70 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
17c80 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
17c90 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
17ca0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17cb0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17cc0 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20           iBreak 
17cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17ce0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17cf0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
17d00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17d10 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
17d20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17d30 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17d40 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17d70 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17d80 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17d90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17da0 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17db0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17dc0 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17dd0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17de0 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17df0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17e10 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17e20 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e50 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17e80 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
17e90 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17ea0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17eb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17ec0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
17ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ef0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
17f00 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17f10 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17f20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17f30 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17f40 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17f50 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17f60 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
17f70 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
17f80 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
17f90 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
17fa0 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
17fb0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
17fc0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
17fd0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
17fe0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
17ff0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
18000 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
18010 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
18020 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
18030 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
18040 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
18050 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
18060 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
18070 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
18080 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18090 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
180a0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
180b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
180c0 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
180d0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
180e0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
180f0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
18100 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
18110 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
18120 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18140 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18150 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
18160 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18170 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
18180 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18190 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
181a0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
181b0 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
181c0 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
181d0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
181e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
181f0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
18200 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
18210 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
18220 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
18230 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
18240 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
18250 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18260 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18270 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
18280 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18290 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
182a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
182b0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
182c0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
182d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
182e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
182f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
18310 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18320 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
18330 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
18340 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
18350 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18360 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18380 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18390 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
183a0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
183b0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
183c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
183d0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
183e0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
183f0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18400 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
18410 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
18420 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
18430 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
18440 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
18450 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
18460 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18470 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
18480 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18490 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
184b0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
184c0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
184d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
184e0 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
184f0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
18500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
18510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18520 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
18530 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
18540 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
18550 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
18560 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18570 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
18580 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18590 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
185a0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
185b0 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
185c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
185d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
185e0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
185f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
18600 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
18610 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18620 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
18630 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
18640 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
18650 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18660 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18680 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18690 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
186a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
186b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
186c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
186d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
186e0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
186f0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18700 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
18710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18730 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
18740 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
18750 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18760 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
18770 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18780 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
18790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
187a0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
187b0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
187c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
187d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
187e0 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
187f0 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20  iCont, r1, 0);. 
18800 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18810 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18820 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18830 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18840 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
18850 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18860 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20  e, p, tab1,.    
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
18890 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
188a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
188c0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
188d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
188e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
188f0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
18900 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18920 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18930 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
18940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18960 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18980 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18990 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
189a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
189c0 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
189d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
189e0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
189f0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61  0 ){.      Expla
18a00 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
18a10 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
18a20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
18a30 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
18a40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
18a50 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
18a60 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
18a70 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
18a80 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
18a90 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
18aa0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
18ab0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
18ac0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18ad0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18ae0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
18af0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
18b00 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18b10 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
18b20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18b30 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
18b40 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
18b50 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
18b60 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
18b70 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
18b80 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
18b90 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
18ba0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
18bb0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
18bc0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
18bd0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18be0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
18bf0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
18c00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18c20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18c30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18c40 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
18c50 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
18c60 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
18c70 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
18c80 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ca0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18cb0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
18cc0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
18cd0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18cf0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18d00 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
18d10 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
18d20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18d40 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
18d50 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
18d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18d70 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
18d80 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
18d90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
18da0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
18db0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
18dc0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
18dd0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
18de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18df0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18e00 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
18e10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18e20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
18e30 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
18e40 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
18e50 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
18e60 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
18e70 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18e80 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
18e90 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
18ea0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
18eb0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
18ec0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
18ed0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
18ee0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
18ef0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
18f00 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
18f10 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
18f20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
18f30 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
18f40 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
18f50 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
18f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
18f70 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
18f80 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
18f90 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
18fa0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
18fb0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
18fc0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
18fd0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
18fe0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
18ff0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19000 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
19010 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
19020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19040 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19050 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
19060 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
19070 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
19080 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
19090 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
190a0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
190d0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
190e0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
190f0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
19100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19110 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19120 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
19130 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
19140 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
19150 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
19160 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
19170 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
19180 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19190 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
191a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
191b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
191c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
191d0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
191e0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
191f0 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
19200 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
19210 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
19220 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
19230 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
19240 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
19250 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
19260 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
19270 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
19280 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
19290 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
192a0 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
192b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
192c0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
192d0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
192e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
192f0 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
19300 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19310 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
19320 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
19330 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
19340 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
19350 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
19360 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
19370 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
19380 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
19390 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
193a0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
193b0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
193c0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
193d0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
193e0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
193f0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
19400 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
19410 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
19420 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
19430 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
19440 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
19450 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
19460 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
19470 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
19480 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
19490 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
194a0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
194b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
194c0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
194d0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
194e0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
194f0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
19500 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
19510 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
19520 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
19530 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
19540 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
19550 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
19560 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
19570 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
19580 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
19590 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
195a0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
195b0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
195c0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
195d0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
195e0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
195f0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
19600 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
19610 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
19620 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
19630 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
19640 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
19650 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
19660 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
19670 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19680 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19690 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
196a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
196b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
196c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
196d0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
196e0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
196f0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
19700 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
19710 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19720 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
19730 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
19740 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
19750 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
19760 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
19770 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
19780 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
19790 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
197a0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
197b0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
197c0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
197d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
197e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
197f0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
19800 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
19810 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
19820 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19830 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
19840 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
19850 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19860 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19870 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
19880 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
19890 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
198a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
198b0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
198c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
198d0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
198e0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
198f0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19900 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
19910 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
19920 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
19930 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
19940 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19950 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
19960 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
19970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19980 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
19990 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
199a0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
199b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
199c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
199d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
199f0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
19a00 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
19a10 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
19a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19a30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
19a40 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
19a50 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
19a60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19a90 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
19aa0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19ab0 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
19ac0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
19ad0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
19ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19af0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19b00 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
19b10 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
19b20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
19b40 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
19b50 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
19b60 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
19b70 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
19b80 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
19b90 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
19ba0 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
19bb0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
19bc0 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
19bd0 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
19be0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19bf0 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
19c00 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
19c10 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
19c20 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
19c30 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
19c40 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
19c50 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
19c60 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
19c70 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
19c80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19c90 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
19ca0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19cb0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cd0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
19ce0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19cf0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
19d00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
19d10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d20 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
19d30 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
19d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19d60 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
19d70 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
19d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
19da0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
19db0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19dc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19dd0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19de0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19df0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19e20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19e30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
19e40 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
19e50 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
19e60 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
19e70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19e80 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
19e90 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
19ea0 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
19eb0 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
19ec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19ed0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ef0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
19f00 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
19f10 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
19f20 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
19f30 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
19f40 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
19f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f60 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
19f70 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
19f80 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20  iSDParm, r1,.   
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64          pIn->iSd
19fb0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19fd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19fe0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
19ff0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a000 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a010 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
1a020 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a030 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
1a040 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
1a050 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1a060 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1a070 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1a080 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
1a090 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
1a0a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
1a0b0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
1a0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
1a0d0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
1a0e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
1a0f0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
1a100 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
1a110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a120 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a130 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a140 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
1a150 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
1a160 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
1a170 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1a180 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
1a190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a1a0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1a1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a1c0 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
1a1d0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1a1e0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a1f0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a200 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1a210 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
1a220 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
1a230 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
1a240 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a250 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
1a260 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
1a270 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
1a280 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
1a290 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
1a2a0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1a2b0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a2c0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
1a2d0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
1a2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a2f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1a300 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
1a310 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
1a320 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a340 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a350 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
1a360 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
1a370 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a380 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
1a390 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
1a3a0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
1a3b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
1a3c0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
1a3d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a3e0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
1a3f0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
1a400 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
1a410 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
1a420 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
1a430 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
1a440 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1a450 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
1a460 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1a470 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
1a480 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
1a490 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
1a4a0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
1a4b0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
1a4c0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
1a4d0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
1a4e0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
1a4f0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
1a500 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
1a510 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a520 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a530 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
1a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a550 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
1a560 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
1a570 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a590 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
1a5a0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a5b0 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
1a5c0 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
1a5d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1a5e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
1a5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a600 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
1a610 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
1a620 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
1a630 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1a640 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
1a650 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
1a660 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a670 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a680 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
1a690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
1a6b0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
1a6c0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1a6d0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
1a6e0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1a6f0 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
1a700 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
1a710 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
1a720 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
1a730 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
1a740 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
1a750 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
1a760 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
1a770 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
1a780 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
1a790 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
1a7a0 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
1a7b0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
1a7c0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
1a7d0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a7e0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
1a7f0 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
1a800 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
1a810 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
1a820 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a830 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
1a840 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
1a850 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
1a860 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
1a870 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
1a880 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
1a890 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
1a8a0 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
1a8b0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
1a8c0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
1a8d0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
1a8e0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
1a8f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
1a900 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1a910 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1a920 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
1a930 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1a950 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1a960 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
1a970 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
1a980 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
1a990 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
1a9a0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
1a9b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
1a9c0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1a9d0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
1a9e0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
1a9f0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1aa00 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
1aa10 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
1aa20 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
1aa30 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1aa50 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
1aa60 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
1aa70 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1aa80 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1aa90 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1aaa0 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
1aab0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
1aac0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1aad0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1aae0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1aaf0 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
1ab00 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1ab10 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1ab20 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ab30 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
1ab40 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
1ab50 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1ab60 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1ab70 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
1ab80 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
1ab90 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
1aba0 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
1abb0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
1abc0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1abd0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
1abe0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
1abf0 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
1ac00 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
1ac10 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
1ac20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ac30 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
1ac40 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
1ac50 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
1ac60 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
1ac70 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1ac80 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1ac90 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1aca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1acb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1acc0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
1acd0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
1ace0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
1acf0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
1ad00 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad10 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
1ad20 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
1ad40 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
1ad50 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad60 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
1ad70 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1ad80 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
1ad90 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
1ada0 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
1adb0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1adc0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1add0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
1ade0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
1adf0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
1ae00 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1ae10 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ae20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae30 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1ae40 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
1ae50 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
1ae60 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
1ae70 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
1ae80 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
1ae90 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1aea0 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
1aeb0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
1aec0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
1aed0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
1aee0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
1aef0 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
1af00 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
1af10 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
1af20 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
1af30 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
1af40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
1af50 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
1af60 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
1af70 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
1af80 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
1af90 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
1afa0 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
1afb0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
1afc0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
1afd0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
1afe0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
1aff0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
1b000 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
1b010 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
1b020 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
1b030 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
1b040 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
1b050 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
1b060 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
1b070 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1b080 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
1b090 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1b0a0 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
1b0b0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
1b0c0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
1b0d0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
1b0e0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
1b0f0 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
1b100 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
1b110 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
1b120 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1b130 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
1b140 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
1b150 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
1b160 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
1b170 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
1b180 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
1b190 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
1b1a0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
1b1b0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
1b1c0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
1b1d0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
1b1e0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
1b1f0 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
1b200 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
1b210 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
1b220 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
1b230 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
1b240 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
1b250 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
1b260 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
1b270 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
1b280 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
1b290 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
1b2a0 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
1b2b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
1b2c0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
1b2d0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
1b2e0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
1b2f0 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
1b300 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
1b310 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
1b320 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
1b330 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
1b340 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
1b350 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
1b360 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
1b370 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
1b380 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
1b390 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
1b3a0 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
1b3b0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
1b3c0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
1b3d0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
1b3e0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
1b3f0 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
1b400 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
1b410 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
1b420 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
1b430 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
1b440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1b450 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
1b460 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
1b470 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
1b480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b490 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b4a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1b4b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b4c0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
1b4d0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
1b4e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1b4f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1b500 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
1b510 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
1b520 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
1b530 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1b540 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1b550 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
1b560 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
1b570 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
1b580 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
1b590 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
1b5a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1b5b0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1b5c0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
1b5d0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
1b5e0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
1b5f0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
1b600 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
1b610 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
1b620 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
1b630 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
1b640 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
1b650 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
1b660 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1b670 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1b680 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
1b690 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
1b6a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b6b0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b6c0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
1b6d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b6e0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
1b6f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b700 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
1b710 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b720 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
1b730 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b740 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
1b750 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b760 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
1b770 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b780 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1b790 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1b7a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
1b7b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b7c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b7d0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
1b7e0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b7f0 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
1b800 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b810 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
1b820 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b830 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
1b840 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
1b850 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
1b860 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b870 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
1b880 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b890 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1b8a0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
1b8b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b8c0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
1b8d0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
1b8e0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
1b8f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
1b900 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
1b910 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b920 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1b930 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
1b940 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b950 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
1b960 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b970 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
1b980 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b990 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
1b9a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b9b0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
1b9c0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9d0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
1b9e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b9f0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
1ba00 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
1ba10 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
1ba20 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
1ba30 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
1ba40 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
1ba50 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
1ba60 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1ba70 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
1ba80 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
1ba90 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
1baa0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
1bab0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
1bac0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
1bad0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
1bae0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
1baf0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
1bb00 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
1bb10 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1bb20 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
1bb30 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
1bb40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bb50 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1bb60 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
1bb70 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
1bb80 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
1bb90 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
1bba0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
1bbb0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
1bbc0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1bbe0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
1bbf0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
1bc00 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
1bc10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1bc20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
1bc30 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
1bc40 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
1bc50 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
1bc60 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
1bc70 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1bc80 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
1bc90 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1bca0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bcb0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
1bcc0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bcd0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
1bce0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
1bcf0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1bd00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1bd10 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1bd20 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
1bd30 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1bd40 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1bd50 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1bd60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bd70 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
1bd80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1bd90 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
1bda0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
1bdb0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
1bdc0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
1bdd0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
1bde0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
1bdf0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1be00 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
1be10 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
1be20 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
1be30 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
1be40 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
1be50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
1be60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1be70 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1be80 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
1be90 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
1bea0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
1beb0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
1bec0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
1bed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1bee0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1bef0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bf00 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
1bf10 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
1bf20 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
1bf30 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
1bf40 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
1bf50 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
1bf60 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1bf70 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
1bf80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1bf90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
1bfa0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
1bfb0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1bfc0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
1bfd0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
1bfe0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
1bff0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
1c000 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
1c010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c020 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
1c030 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
1c040 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
1c050 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
1c060 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
1c070 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
1c080 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
1c090 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
1c0a0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
1c0b0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
1c0c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
1c0d0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1c0e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c0f0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1c100 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
1c110 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
1c120 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
1c130 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
1c140 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c150 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c160 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1c170 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c180 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
1c190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c1a0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
1c1b0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1c1c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c1d0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
1c1e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1c1f0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1c200 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1c210 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
1c220 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
1c230 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
1c240 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1c250 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1c260 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1c270 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c280 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1c290 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1c2a0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1c2b0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1c2c0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1c2d0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1c2e0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1c2f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c300 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1c310 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1c320 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1c330 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1c340 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1c350 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1c360 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1c370 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1c380 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1c390 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1c3a0 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1c3b0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1c3c0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1c3d0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1c3e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1c3f0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1c400 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1c410 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1c420 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1c430 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1c440 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1c450 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1c460 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1c470 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1c480 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1c490 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1c4a0 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1c4b0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1c4c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c4d0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1c4e0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1c4f0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1c500 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1c510 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1c520 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1c530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c540 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c550 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1c560 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1c570 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1c580 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c590 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1c5a0 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1c5b0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1c5c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1c5d0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1c5e0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1c5f0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1c600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c610 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1c620 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1c630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c640 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1c650 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1c660 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c670 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1c680 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1c690 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1c6a0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1c6b0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1c6c0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1c6d0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c6e0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1c6f0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1c700 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1c710 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1c720 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1c730 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1c740 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1c750 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1c760 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1c770 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1c780 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1c790 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1c7a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c7b0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1c7c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1c7d0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1c7e0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1c7f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c800 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1c810 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1c820 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1c830 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1c840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c850 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c860 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1c870 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1c880 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1c890 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1c8a0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1c8b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c8c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1c8d0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1c8e0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1c8f0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1c900 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1c910 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1c920 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1c930 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1c940 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1c950 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1c960 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1c970 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1c980 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1c990 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1c9a0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1c9b0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1c9c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1c9d0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1c9e0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1c9f0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1ca00 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1ca10 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1ca20 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1ca30 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1ca40 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1ca50 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1ca60 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1ca70 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1ca80 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1ca90 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1caa0 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1cab0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1cac0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1cad0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1cae0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1caf0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1cb00 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1cb10 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1cb30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb50 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1cb60 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1cb70 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1cb80 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1cbb0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1cbc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbd0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1cbe0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1cbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1cc00 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1cc10 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1cc20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1cc30 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1cc40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1cc50 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1cc60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc70 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1cc80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cc90 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1cca0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1ccb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ccc0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1ccd0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1cce0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1ccf0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1cd00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1cd10 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1cd20 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1cd30 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69  ddrB);..  Explai
1cd40 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1cd50 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25  se, 1, "MERGE (%
1cd60 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  s)", selectOpNam
1cd70 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f  e(p->op)));..  /
1cd80 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1cd90 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1cda0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1cdb0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1cdc0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1cdd0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1cde0 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1cdf0 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1ce00 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1ce10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1ce20 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1ce30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ce40 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1ce50 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce60 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1ce70 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1ce80 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1ce90 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1cea0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1ceb0 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  itA;.  ExplainQu
1cec0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1ced0 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20   1, "LEFT"));.  
1cee0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1cef0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
1cf00 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
1cf10 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1cf20 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  (v, regAddrA);. 
1cf30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1cf40 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1cf50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1cf60 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1cf70 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1cf80 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
1cf90 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
1cfa0 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
1cfb0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1cfc0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1cfd0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1cfe0 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1cff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d000 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1d010 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
1d020 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
1d030 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d040 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
1d050 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
1d060 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
1d070 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
1d080 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
1d090 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1d0a0 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
1d0b0 3d 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e  = 0;  .  Explain
1d0c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1d0d0 65 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b  e, 1, "RIGHT"));
1d0e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1d0f0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
1d100 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
1d110 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
1d120 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
1d130 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
1d140 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1d150 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42  tine(v, regAddrB
1d160 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d170 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d180 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
1d190 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
1d1a0 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
1d1b0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
1d1c0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
1d1d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
1d1e0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d1f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1d200 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
1d210 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
1d220 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d230 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d240 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d250 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
1d260 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d290 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
1d2a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d2b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d2c0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d2d0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
1d2e0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d2f0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d300 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d310 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d320 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1d330 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1d340 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
1d350 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1d360 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1d370 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
1d380 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
1d390 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
1d3a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1d3b0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
1d3c0 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
1d3d0 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
1d3e0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
1d3f0 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
1d400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
1d410 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
1d420 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
1d430 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d440 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1d450 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1d460 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
1d470 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1d480 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1d490 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
1d4a0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
1d4b0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
1d4c0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1d4d0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d4e0 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
1d4f0 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
1d500 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d510 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
1d520 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d530 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
1d540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d550 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d560 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1d570 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1d580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d590 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d5a0 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1d5b0 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1d5e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d5f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d600 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1d610 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1d620 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1d630 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
1d640 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
1d650 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ctRow);.  }..  /
1d660 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d670 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d680 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d690 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1d6a0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d6b0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d6c0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1d6d0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d6e0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d6f0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1d700 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1d710 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1d720 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1d730 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1d740 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1d750 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1d760 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1d770 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d780 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1d790 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1d7a0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1d7b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1d7c0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1d7d0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1d7e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7f0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d800 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1d810 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d830 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1d840 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d850 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1d860 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1d870 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1d880 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d890 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1d8a0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1d8b0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1d8c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d8d0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1d8e0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1d8f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d900 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d910 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1d920 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d930 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d940 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1d950 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d960 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1d970 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1d980 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1d990 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1d9a0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d9b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1d9c0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d9d0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1d9e0 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1d9f0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1da00 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1da10 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1da20 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1da30 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1da40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1da50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da60 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da70 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1da90 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1daa0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1dab0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1dac0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1dad0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1dae0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1daf0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1db00 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1db10 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1db20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1db30 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1db40 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1db50 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1db60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1db80 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1db90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1dba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dbb0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1dbc0 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1dbd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1dbe0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1dbf0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1dc00 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1dc10 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1dc20 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1dc30 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1dc40 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1dc50 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1dc60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc70 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dc80 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1dc90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dca0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dcb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dcc0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dcd0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dce0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1dcf0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1dd00 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1dd10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1dd20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1dd30 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1dd40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dd50 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1dd60 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1dd70 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1dd80 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1dd90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dda0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1ddb0 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1ddc0 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1ddd0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1ddf0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1de00 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1de10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1de20 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1de30 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1de40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1de50 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1de60 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1de70 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1de80 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1de90 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1dea0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1deb0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1dec0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1ded0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1dee0 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1def0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1df00 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1df10 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1df20 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1df30 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1df40 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1df50 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1df60 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1df70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1df80 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1df90 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1dfa0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1dfb0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1dfc0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1dfd0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1dfe0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1dff0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1e000 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1e010 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1e020 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1e030 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Pop(pParse);.  r
1e040 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1e050 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1e060 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1e070 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1e080 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1e090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1e0a0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1e0b0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1e0c0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1e0d0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1e0e0 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1e0f0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1e100 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1e110 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1e120 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1e130 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1e140 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1e150 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1e160 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1e170 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1e180 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1e190 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1e1a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1e1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e1c0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1e1d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1e1e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e1f0 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1e200 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1e210 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1e220 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1e230 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1e240 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1e250 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1e260 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1e270 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1e280 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1e290 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1e2a0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1e2b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e2c0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1e2d0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1e2e0 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1e2f0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1e300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1e310 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1e320 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1e330 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1e340 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1e350 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1e360 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1e370 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1e380 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e390 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1e3a0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1e3b0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1e3c0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1e3d0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1e3e0 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1e3f0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1e400 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1e410 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1e420 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1e430 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1e440 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1e450 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1e460 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1e470 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1e480 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1e490 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1e4a0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1e4b0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1e4c0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1e4d0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1e4e0 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1e4f0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1e500 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1e510 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1e520 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1e530 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1e540 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1e550 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1e560 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1e570 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1e580 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1e590 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1e5a0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1e5b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1e5c0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1e5d0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1e5e0 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1e5f0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1e600 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1e610 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1e620 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1e630 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1e640 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1e650 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1e660 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1e670 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1e680 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1e690 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e6a0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1e6b0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52  .   && pExpr->iR
1e6c0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70  ightJoinTable==p
1e6d0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20  Subst->iTable.  
1e6e0 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52  ){.    pExpr->iR
1e6f0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1e700 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1e710 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  e;.  }.  if( pEx
1e720 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1e730 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1e740 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e750 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
1e760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
1e770 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
1e780 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
1e790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
1e7a0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
1e7b0 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53  Expr *pCopy = pS
1e7c0 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ubst->pEList->a[
1e7d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1e7e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1e7f0 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20  r ifNullRow;.   
1e800 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73     assert( pSubs
1e810 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t->pEList!=0 && 
1e820 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1e830 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Subst->pEList->n
1e840 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1e850 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
1e860 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1e870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e880 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1e890 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e8a0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1e8b0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1e8c0 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1e8d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e8e0 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1e8f0 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1e900 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1e910 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1e920 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1e930 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1e940 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1e950 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1e960 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1e970 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e980 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1e990 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1e9a0 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1e9b0 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1e9c0 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1e9d0 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e9e0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1e9f0 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1ea00 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1ea10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1ea20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1ea30 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1ea40 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1ea50 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1ea60 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1ea70 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1ea80 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1ea90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1eaa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1eab0 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1eac0 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1ead0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1eae0 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1eaf0 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1eb00 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1eb10 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1eb20 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1eb30 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1eb40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eb50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eb60 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1eb80 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1eb90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1eba0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1ebb0 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1ebc0 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1ebd0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1ebe0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1ebf0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1ec00 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1ec10 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1ec20 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1ec30 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ec40 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1ec50 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1ec60 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ec70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1ec80 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ec90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1eca0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1ecb0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ecc0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ecd0 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1ece0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ecf0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1ed00 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1ed10 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1ed20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1ed30 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1ed40 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1ed50 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1ed60 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1ed70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1ed80 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1ed90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1eda0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1edb0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1edc0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1edd0 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1ede0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1edf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1ee00 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ee10 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ee20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ee30 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ee40 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1ee50 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1ee60 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee70 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1ee80 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1ee90 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1eea0 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1eeb0 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1eec0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1eed0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1eee0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1eef0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1ef00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1ef10 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1ef20 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1ef30 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1ef40 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1ef50 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1ef60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ef70 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1ef80 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1ef90 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1efa0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1efb0 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1efc0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1efd0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1efe0 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1eff0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f000 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1f010 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1f020 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f030 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1f040 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1f050 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f060 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1f070 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1f080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1f090 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1f0a0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1f0b0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1f0c0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1f0d0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1f0e0 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1f0f0 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1f100 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f110 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1f120 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1f130 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1f140 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f160 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1f170 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1f180 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1f190 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f1a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f1b0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f1c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f1d0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1f1e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f1f0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f210 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1f220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f230 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1f240 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1f250 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1f260 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1f270 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f280 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1f290 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1f2a0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1f2b0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1f2c0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1f2d0 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1f2e0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1f2f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1f300 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1f310 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1f320 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1f330 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f340 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1f350 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f360 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1f370 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1f380 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1f390 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1f3a0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1f3b0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1f3c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f3d0 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1f3e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1f3f0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1f400 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1f410 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1f420 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1f430 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1f440 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1f450 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1f460 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1f470 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f480 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1f490 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1f4a0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1f4b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1f4c0 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1f4d0 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1f4e0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1f4f0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1f500 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1f510 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1f520 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f530 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f540 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1f550 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1f560 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1f570 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1f580 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1f590 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1f5a0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1f5b0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1f5c0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1f5d0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1f5e0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1f5f0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1f600 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1f610 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1f620 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1f630 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1f640 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1f650 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1f660 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f670 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f680 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f690 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f6a0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1f6b0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1f6c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f6d0 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1f6e0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1f6f0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f700 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f710 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f720 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f730 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1f740 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f750 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1f760 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1f770 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f780 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1f790 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1f7a0 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1f7b0 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1f7c0 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1f7d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1f7e0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1f7f0 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1f800 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1f810 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1f820 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1f830 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1f840 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1f850 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1f860 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1f870 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1f880 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1f890 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1f8a0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f8b0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f8c0 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1f8d0 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1f8e0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f8f0 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1f900 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1f910 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f920 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1f930 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1f940 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1f950 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1f960 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1f970 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f980 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1f990 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1f9a0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1f9b0 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1f9c0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1f9d0 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1f9e0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1f9f0 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1fa00 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1fa10 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1fa20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1fa30 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1fa40 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1fa50 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1fa60 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1fa70 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1fa80 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1fa90 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1faa0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1fab0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1fac0 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1fad0 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1fae0 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1faf0 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1fb00 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1fb10 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1fb20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fb30 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1fb40 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1fb50 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fb60 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1fb70 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1fb80 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1fb90 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1fba0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1fbb0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1fbc0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1fbd0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1fbe0 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1fbf0 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1fc00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1fc10 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1fc20 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1fc30 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1fc40 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1fc50 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fc60 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fc70 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fc80 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1fc90 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1fca0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fcb0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fcc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fcd0 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1fce0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1fcf0 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1fd00 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1fd10 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1fd20 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1fd30 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1fd40 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1fd50 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1fd60 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1fd70 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1fd80 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1fd90 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1fda0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1fdb0 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1fdc0 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1fdd0 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1fde0 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1fdf0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1fe00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fe10 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1fe20 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1fe30 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1fe40 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1fe50 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1fe60 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1fe70 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1fe80 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1fe90 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1fea0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1feb0 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1fec0 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1fed0 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1fee0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fef0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1ff00 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1ff10 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1ff20 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1ff30 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1ff40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1ff50 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1ff60 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1ff70 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1ff80 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ff90 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1ffa0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1ffb0 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1ffc0 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1ffd0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1ffe0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1fff0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
20000 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
20010 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20020 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
20030 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
20040 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
20050 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
20060 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
20070 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
20080 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
20090 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
200a0 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
200b0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
200c0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
200d0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
200e0 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
200f0 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
20100 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
20110 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
20120 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
20130 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
20140 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
20150 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
20160 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
20170 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
20180 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
20190 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
201a0 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
201b0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
201c0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
201d0 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
201e0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
201f0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
20200 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
20210 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
20220 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
20230 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
20240 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
20250 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
20260 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
20270 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
20280 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
20290 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
202a0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
202b0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
202c0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
202d0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
202e0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
202f0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
20300 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
20310 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
20320 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
20330 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
20340 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
20350 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
20360 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
20370 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
20380 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
20390 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
203a0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
203b0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
203c0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
203d0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
203e0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
203f0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
20400 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20410 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
20420 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
20430 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
20440 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
20450 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
20460 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
20470 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20480 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
20490 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
204a0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
204b0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
204c0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
204d0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
204e0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
204f0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
20500 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
20510 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
20520 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
20530 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
20540 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
20550 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
20560 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20570 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
20580 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
20590 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
205a0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
205b0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
205c0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
205d0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
205e0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
205f0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
20600 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
20610 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
20620 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
20630 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
20640 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
20650 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
20660 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
20670 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
20680 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20690 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
206a0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
206b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
206c0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
206d0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
206e0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
206f0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
20700 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
20710 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20720 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20730 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
20740 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
20750 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
20760 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
20770 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20780 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
20790 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
207a0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
207b0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
207c0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
207d0 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
207e0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
207f0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20800 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20810 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
20820 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
20830 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
20840 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
20850 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20860 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
20870 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
20880 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
20890 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
208a0 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
208b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
208c0 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
208d0 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
208e0 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
208f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
20900 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
20910 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
20920 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
20930 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
20940 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
20950 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
20960 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
20970 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
20980 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
20990 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
209a0 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
209b0 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
209c0 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
209d0 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
209e0 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
209f0 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
20a00 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20a10 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20a20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20a30 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20a40 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
20a50 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
20a60 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
20a70 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
20a80 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
20a90 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
20aa0 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20ab0 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20ac0 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20ad0 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20ae0 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20af0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20b00 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20b10 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20  aximal.).**.**  
20b20 28 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20  (25)  If either 
20b30 74 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20  the subquery or 
20b40 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
20b50 20 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64   contains a wind
20b60 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e  ow.**        fun
20b70 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c  ction in the sel
20b80 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45  ect list or ORDE
20b90 52 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61  R BY clause, fla
20ba0 74 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ttening.**      
20bb0 20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74    is not attempt
20bc0 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  ed..**.**.** In 
20bd0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
20be0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
20bf0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20c00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20c10 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
20c20 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
20c30 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
20c40 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
20c50 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
20c60 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
20c70 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
20c80 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20c90 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
20ca0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
20cb0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
20cc0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
20cd0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
20ce0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
20cf0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
20d00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
20d10 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
20d20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
20d30 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
20d40 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
20d50 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
20d60 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
20d70 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
20d80 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
20d90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
20da0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20db0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
20dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20dd0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
20de0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20df0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20e10 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
20e20 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
20e30 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
20e40 6e 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20  nt isAgg        
20e50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
20e60 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
20e70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20e80 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
20e90 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
20ea0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
20eb0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
20ec0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
20ed0 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72  rent;    /* Curr
20ee0 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65  ent UNION ALL te
20ef0 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  rm of the other 
20f00 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63  query */.  Selec
20f10 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
20f20 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
20f30 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
20f40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
20f50 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
20f60 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
20f70 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
20f80 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
20f90 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
20fa0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
20fb0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20fc0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
20fd0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
20fe0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
20ff0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
21000 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
21010 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
21020 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
21030 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
21040 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
21050 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
21060 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a  ewParent = -1;/*
21070 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62   Replacement tab
21080 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a  le for iParent *
21090 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
210a0 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  in = 0; /* True 
210b0 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72  if pSub is the r
210c0 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c  ight side of a L
210d0 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a  EFT JOIN */    .
210e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
210f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21100 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
21110 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
21120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21130 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21140 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21150 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
21160 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
21170 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
21180 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21190 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
211a0 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
211b0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
211c0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
211d0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
211e0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
211f0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
21200 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74  ==0 );.  if( Opt
21210 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
21220 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
21230 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
21240 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
21250 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
21260 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
21270 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
21280 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
21290 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
212a0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
212b0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
212c0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
212d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
212e0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
212f0 70 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e  pSub!=0 );..#ifn
21300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21310 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
21320 20 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62   p->pWin || pSub
21330 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20  ->pWin ) return 
21340 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21350 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21360 6f 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69  on (25) */.#endi
21370 66 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  f..  pSubSrc = p
21380 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
21390 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
213a0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
213b0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
213c0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
213d0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
213e0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
213f0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
21400 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
21410 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
21420 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
21430 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21440 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
21450 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
21460 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
21470 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
21480 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21490 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
214a0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
214b0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
214c0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
214d0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
214e0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
214f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
21500 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
21510 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21520 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21530 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
21540 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
21550 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
21560 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
21570 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21580 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
21590 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
215a0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
215b0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
215c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21600 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
21610 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21620 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
21630 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21650 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
21660 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
21670 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21680 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
21690 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
216a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
216b0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
216c0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
216d0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
216e0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
216f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
21700 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
21710 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
21720 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
21730 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21740 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21780 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
21790 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
217a0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
217b0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
217e0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
217f0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
21800 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
21810 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21820 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21830 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
21840 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
21850 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21860 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
21870 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21880 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21890 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
218a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
218b0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
218c0 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
218d0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
218e0 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
218f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
21900 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21910 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21920 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21930 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
21940 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
21950 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
21960 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
21970 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
21980 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
21990 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
219a0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
219b0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
219c0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
219d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
219e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
219f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
21a00 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
21a10 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
21a20 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
21a30 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
21a40 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
21a50 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
21a60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21a70 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21a80 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21a90 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
21aa0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
21ab0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
21ac0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
21ad0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
21ae0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
21af0 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
21b00 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
21b10 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
21b20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
21b30 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
21b40 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
21b50 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
21b60 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
21b70 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
21b80 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
21b90 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
21ba0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
21bb0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
21bc0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
21bd0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
21be0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
21bf0 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
21c00 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
21c10 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
21c20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
21c30 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
21c40 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
21c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21c60 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21c70 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
21c80 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
21c90 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
21ca0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
21cb0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
21cc0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
21cd0 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21ce0 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21cf0 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21d00 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21d10 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21d20 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21d30 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21d40 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21d50 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
21d60 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
21d70 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
21d80 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
21d90 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
21da0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
21db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21dc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21dd0 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21de0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21df0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21e00 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21e10 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21e20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21e30 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21e40 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21e50 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
21e60 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
21e70 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
21e80 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
21e90 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
21ea0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
21eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21ec0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21ed0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21ee0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21ef0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21f00 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21f10 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21f20 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21f30 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21f40 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21f50 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
21f60 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
21f70 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
21f80 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
21f90 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
21fa0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
21fb0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
21fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21fd0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21fe0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21ff0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
22000 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
22010 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22020 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22030 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22040 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22050 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
22060 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
22070 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
22080 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
22090 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
220a0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
220b0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
220c0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
220d0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
220e0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
220f0 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
22100 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
22110 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
22120 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
22150 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
22160 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22190 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
221a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
221b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
221c0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
221d0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
221e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
221f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
22200 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
22210 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22220 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
22230 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
22240 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
22250 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
22260 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
22270 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
22280 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
22290 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
222a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
222b0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
222c0 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
222d0 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
222e0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
222f0 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
22300 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
22310 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
22320 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
22330 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
22340 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
22350 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22360 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
22370 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
22380 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
22390 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
223a0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
223b0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
223c0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
223d0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
223e0 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
223f0 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
22400 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
22410 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
22420 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
22430 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
22440 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
22450 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
22460 25 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %u.%p from term 
22470 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
22480 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
22490 73 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72  selId, pSub, iFr
224a0 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
224b0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
224c0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
224d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
224e0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
224f0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
22500 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22510 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22520 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
22530 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
22540 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
22550 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22560 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
22570 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
22580 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
22590 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
225a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
225b0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
225c0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
225d0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
225e0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
225f0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
22600 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
22610 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
22620 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
22630 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
22640 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
22650 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
22660 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
22670 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
22680 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
22690 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
226a0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
226b0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
226c0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
226d0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
226e0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
226f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
22700 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
22710 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
22720 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
22730 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
22740 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
22750 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
22760 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
22770 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
22780 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
22790 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
227a0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
227b0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
227c0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
227d0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
227e0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
227f0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
22800 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
22810 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
22820 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22830 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
22840 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
22850 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22860 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
22870 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
22880 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
22890 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
228a0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
228b0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
228c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
228d0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
228e0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
228f0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
22900 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
22910 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
22920 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
22930 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
22940 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22950 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
22960 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
22970 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
22980 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
22990 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
229a0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
229b0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
229c0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
229d0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
229e0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
229f0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
22a00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
22a10 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
22a20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
22a30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
22a40 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
22a50 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
22a60 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
22a70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
22a80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22a90 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
22aa0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22ab0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
22ac0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
22ad0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
22ae0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
22af0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
22b00 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22b10 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
22b20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
22b30 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
22b40 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
22b50 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
22b60 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22b70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
22b80 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
22b90 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
22ba0 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
22bb0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22bc0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
22bd0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
22be0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
22bf0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
22c00 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
22c10 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
22c20 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20  ery flattener". 
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63               " c
22c50 72 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65  reates %u as pee
22c60 72 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64  r\n",pNew->selId
22c70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
22c80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
22c90 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
22ca0 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
22cb0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
22cc0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
22cd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22ce0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
22cf0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
22d00 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
22d10 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
22d20 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
22d30 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
22d40 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
22d50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22d60 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
22d70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
22d80 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22d90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
22da0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22db0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
22dc0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
22dd0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22de0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
22df0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22e00 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
22e10 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
22e20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22e30 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22e40 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
22e50 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
22e60 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
22e70 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
22e80 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22e90 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
22ea0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
22eb0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
22ec0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
22ed0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
22ee0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
22ef0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
22f00 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
22f10 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
22f20 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
22f30 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
22f40 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
22f50 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
22f60 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
22f70 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
22f80 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
22f90 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
22fa0 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
22fb0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
22fc0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
22fd0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
22fe0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
22ff0 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
23000 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23010 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23020 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
23030 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
23040 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
23050 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
23060 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
23070 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
23080 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
23090 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
230a0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
230b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
230c0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
230d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
230e0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
230f0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
23100 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
23110 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
23120 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
23130 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
23140 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
23150 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
23160 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
23170 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
23180 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
23190 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
231a0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
231b0 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
231c0 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
231d0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
231e0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
231f0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
23200 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
23210 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23220 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
23230 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
23240 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
23250 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
23260 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
23270 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
23280 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
23290 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
232a0 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
232b0 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
232c0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
232d0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
232e0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
232f0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
23300 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
23310 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
23320 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
23330 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
23340 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
23350 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
23360 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
23370 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
23380 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
23390 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
233a0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
233b0 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
233c0 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
233d0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
233e0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
233f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
23400 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
23410 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
23420 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
23430 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
23440 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
23450 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
23460 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
23470 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
23480 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
23490 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
234a0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
234b0 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
234c0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
234d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
234e0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
234f0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
23500 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
23510 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
23520 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
23530 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
23540 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
23550 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
23560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23570 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
23580 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
23590 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
235a0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
235b0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
235c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
235d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
235e0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
235f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
23600 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
23610 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
23620 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
23630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23640 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23650 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
23660 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
23670 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23680 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23690 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
236a0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
236b0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
236c0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
236d0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
236e0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
236f0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
23700 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
23710 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
23720 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
23730 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
23740 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
23750 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
23760 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
23770 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
23780 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
23790 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
237a0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
237b0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
237c0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
237d0 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
237e0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
237f0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23800 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
23810 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
23820 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
23830 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
23840 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
23850 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
23860 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
23870 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
23880 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
23890 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
238a0 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
238b0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
238c0 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
238d0 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
238e0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
238f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23900 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
23910 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
23920 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
23930 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
23940 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23950 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
23960 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
23970 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
23980 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23990 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
239a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
239b0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
239c0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
239d0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
239e0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
239f0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
23a00 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23a20 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23a30 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23a40 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23a50 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23a60 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23a70 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23a80 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23a90 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23aa0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23ab0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23ac0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23ad0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23ae0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23af0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23b00 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23b10 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23b20 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23b30 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23b40 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23b50 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23b60 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23b70 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23b80 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23b90 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23ba0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23bb0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23bc0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23bd0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23be0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23bf0 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23c00 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23c10 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23c20 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23c30 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23c40 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23c50 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23c60 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23c70 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23c80 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23c90 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23ca0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23cb0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23cc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23cd0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23ce0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23cf0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23d00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23d10 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23d20 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23d30 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23d40 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23d50 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23d60 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23d70 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23d80 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23d90 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23da0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23db0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23dc0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23dd0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23de0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23df0 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23e00 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23e10 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23e20 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23e30 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23e40 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23e50 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23e60 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23e70 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23e80 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23e90 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23ea0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23eb0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23ec0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23ed0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ee0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
23ef0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
23f00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23f10 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
23f20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
23f30 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
23f40 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
23f50 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
23f60 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
23f70 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
23f80 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
23f90 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
23fa0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
23fb0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
23fc0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
23fd0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
23fe0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
23ff0 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
24000 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24010 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24020 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24030 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24040 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24050 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24060 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24070 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24080 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
24090 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
240a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
240b0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
240c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
240d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
240e0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
240f0 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
24100 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24110 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24130 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
24140 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  e, 0);.    if( i
24150 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20  sLeftJoin>0 ){. 
24160 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
24170 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72  (pWhere, iNewPar
24180 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ent);.    }.    
24190 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
241a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
241b0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
241c0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
241d0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
241e0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
241f0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
24200 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
24210 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24220 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
24230 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24240 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
24250 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24260 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
24270 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
24280 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
24290 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
242a0 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
242b0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
242c0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
242d0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
242e0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
242f0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
24300 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
24310 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
24320 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
24330 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
24340 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
24350 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24360 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
24370 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
24380 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
24390 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
243a0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
243b0 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
243c0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
243d0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
243e0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
243f0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
24400 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
24410 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
24420 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
24430 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
24440 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
24450 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
24460 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
24470 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
24480 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
24490 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
244a0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
244b0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
244c0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
244d0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
244e0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
244f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
24500 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
24510 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
24520 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
24530 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
24540 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
24550 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
24560 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
24570 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
24580 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
24590 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
245a0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
245b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
245c0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
245d0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
245e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
245f0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
24600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24610 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72   */../*.** A str
24620 75 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74  ucture to keep t
24630 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74  rack of all of t
24640 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
24650 20 74 68 61 74 20 61 72 65 20 66 69 78 65 64 20   that are fixed 
24660 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61  to.** a known va
24670 6c 75 65 20 64 75 65 20 74 6f 20 57 48 45 52 45  lue due to WHERE
24680 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
24690 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
246a0 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f  COLUMN=VALUE..*/
246b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
246c0 57 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65  WhereConst Where
246d0 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68  Const;.struct Wh
246e0 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72  ereConst {.  Par
246f0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a  se *pParse;   /*
24700 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
24710 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
24720 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
24730 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53   for COLUMN=CONS
24740 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20  TANT terms */.  
24750 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20  int nChng;      
24760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
24770 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  mes a constant i
24780 73 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a  s propagated */.
24790 20 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b    Expr **apExpr;
247a0 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43     /* [i*2] is C
247b0 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31  OLUMN and [i*2+1
247c0 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b  ] is VALUE */.};
247d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
247e0 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  w entry to the p
247f0 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45  Const object.  E
24800 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64  xcept, do not ad
24810 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70  d duplicate.** p
24820 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a  Column entires..
24830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
24840 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68  onstInsert(.  Wh
24850 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74  ereConst *pConst
24860 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  ,      /* The Wh
24870 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68  ereConst into wh
24880 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72  ich we are inser
24890 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ting */.  Expr *
248a0 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  pColumn,        
248b0 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e     /* The COLUMN
248c0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e   part of the con
248d0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70  straint */.  Exp
248e0 72 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20  r *pValue       
248f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c        /* The VAL
24900 55 45 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  UE part of the c
24910 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
24920 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
24930 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d  t( pColumn->op==
24940 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20  TK_COLUMN );..  
24950 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69  /* 2018-10-25 ti
24960 63 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a  cket [cf5ed20f].
24970 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    ** Make sure t
24980 68 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20  he same pColumn 
24990 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20  is not inserted 
249a0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a  more than once *
249b0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
249c0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69  Const->nConst; i
249d0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ++){.    const E
249e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f  xpr *pExpr = pCo
249f0 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d  nst->apExpr[i*2]
24a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
24a10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
24a20 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  MN );.    if( pE
24a30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f  xpr->iTable==pCo
24a40 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20  lumn->iTable.   
24a50 20 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c    && pExpr->iCol
24a60 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43  umn==pColumn->iC
24a70 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
24a80 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41     return;  /* A
24a90 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20  lready present. 
24aa0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
24ab0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
24ac0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
24ad0 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b  pConst->nConst++
24ae0 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  ;.  pConst->apEx
24af0 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  pr = sqlite3DbRe
24b00 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e  allocOrFree(pCon
24b10 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  st->pParse->db, 
24b20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a  pConst->apExpr,.
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d           pConst-
24b50 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66  >nConst*2*sizeof
24b60 28 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20  (Expr*));.  if( 
24b70 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d  pConst->apExpr==
24b80 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d  0 ){.    pConst-
24b90 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d  >nConst = 0;.  }
24ba0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78  else{.    if( Ex
24bb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 56  prHasProperty(pV
24bc0 61 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f  alue, EP_FixedCo
24bd0 6c 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56  l) ) pValue = pV
24be0 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  alue->pLeft;.   
24bf0 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
24c00 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24c10 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  -2] = pColumn;. 
24c20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70     pConst->apExp
24c30 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  r[pConst->nConst
24c40 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a  *2-1] = pValue;.
24c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
24c60 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43  d all terms of C
24c70 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56  OLUMN=VALUE or V
24c80 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70  ALUE=COLUMN in p
24c90 45 78 70 72 20 77 68 65 72 65 20 56 41 4c 55 45  Expr where VALUE
24ca0 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  .** is a constan
24cb0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  t expression and
24cc0 20 77 68 65 72 65 20 74 68 65 20 74 65 72 6d 20   where the term 
24cd0 6d 75 73 74 20 62 65 20 74 72 75 65 20 62 65 63  must be true bec
24ce0 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61  ause it.** is pa
24cf0 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f  rt of the AND-co
24d00 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66  nnected terms of
24d10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
24d20 20 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a    For each term.
24d30 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74  ** found, add it
24d40 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73   to the pConst s
24d50 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
24d60 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e  tic void findCon
24d70 73 74 49 6e 57 68 65 72 65 28 57 68 65 72 65 43  stInWhere(WhereC
24d80 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78  onst *pConst, Ex
24d90 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
24da0 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
24db0 66 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  ft;.  if( pExpr=
24dc0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
24dd0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24de0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
24df0 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b  mJoin) ) return;
24e00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
24e10 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
24e20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24e30 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24e40 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e  pRight);.    fin
24e50 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43  dConstInWhere(pC
24e60 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  onst, pExpr->pLe
24e70 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ft);.    return;
24e80 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
24e90 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65  ->op!=TK_EQ ) re
24ea0 74 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d  turn;.  pRight =
24eb0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
24ec0 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
24ed0 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74  >pLeft;.  assert
24ee0 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ( pRight!=0 );. 
24ef0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
24f00 30 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68  0 );.  if( pRigh
24f10 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
24f20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
24f30 72 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c 20  roperty(pRight, 
24f40 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20  EP_FixedCol).   
24f50 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24f60 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a  Constant(pLeft).
24f70 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42     && sqlite3IsB
24f80 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e  inary(sqlite3Bin
24f90 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
24fa0 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  q(pConst->pParse
24fb0 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a  ,pLeft,pRight)).
24fc0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e    ){.    constIn
24fd0 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69  sert(pConst, pRi
24fe0 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  ght, pLeft);.  }
24ff0 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74  else.  if( pLeft
25000 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
25010 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
25020 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50  operty(pLeft, EP
25030 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26  _FixedCol).   &&
25040 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25050 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20  nstant(pRight). 
25060 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69    && sqlite3IsBi
25070 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61  nary(sqlite3Bina
25080 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
25090 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c  (pConst->pParse,
250a0 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20  pLeft,pRight)). 
250b0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73   ){.    constIns
250c0 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66  ert(pConst, pLef
250d0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
250e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
250f0 20 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73   a Walker expres
25100 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20  sion callback.  
25110 70 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69  pExpr is a candi
25120 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  date expression.
25130 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  ** to be replace
25140 64 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49  d by a value.  I
25150 66 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76  f pExpr is equiv
25160 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20  alent to one of 
25170 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e  the.** columns n
25180 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d  amed in pWalker-
25190 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20  >u.pConst, then 
251a0 6f 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74  overwrite it wit
251b0 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70  h its.** corresp
251c0 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f  onding value..*/
251d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70  .static int prop
251e0 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70  agateConstantExp
251f0 72 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20  rRewrite(Walker 
25200 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
25210 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
25220 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
25230 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78  Const;.  if( pEx
25240 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
25250 4e 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  N ) return WRC_C
25260 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45  ontinue;.  if( E
25270 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25280 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
25290 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
252a0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e  Continue;.  pCon
252b0 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  st = pWalker->u.
252c0 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pConst;.  for(i=
252d0 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f  0; i<pConst->nCo
252e0 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  nst; i++){.    E
252f0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70  xpr *pColumn = p
25300 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a  Const->apExpr[i*
25310 32 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  2];.    if( pCol
25320 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e  umn==pExpr ) con
25330 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
25340 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d  Column->iTable!=
25350 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
25360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
25370 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75  ( pColumn->iColu
25380 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn!=pExpr->iColu
25390 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
253a0 20 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73     /* A match is
253b0 20 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65   found.  Add the
253c0 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f   EP_FixedCol pro
253d0 70 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f  perty */.    pCo
253e0 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20  nst->nChng++;.  
253f0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
25400 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65  rty(pExpr, EP_Le
25410 61 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  af);.    ExprSet
25420 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25430 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20  EP_FixedCol);.  
25440 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25450 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
25460 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
25470 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
25480 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Const->pParse->d
25490 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  b, pConst->apExp
254a0 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20  r[i*2+1], 0);.  
254b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
254c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
254d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48  .}../*.** The WH
254e0 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE-clause const
254f0 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
25500 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
25510 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
25520 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
25530 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
25540 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41  rm COLUMN=CONSTA
25550 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e  NT or.** CONSTAN
25560 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75  T=COLUMN that mu
25570 73 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f  st be tree (in o
25580 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
25590 68 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76  he terms top-lev
255a0 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63  el.** AND-connec
255b0 74 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  ted terms that a
255c0 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  re not part of a
255d0 20 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   ON clause from 
255e0 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20  a LEFT JOIN).** 
255f0 74 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20  then throughout 
25600 74 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63  the query replac
25610 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75  e all other occu
25620 72 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d  rrences of COLUM
25630 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41  N.** with CONSTA
25640 4e 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  NT within the WH
25650 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
25660 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
25670 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
25680 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25690 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
256a0 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
256b0 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33  t2.b=t1.a AND t3
256c0 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73  .c=t2.b.**.** Is
256d0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
256e0 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  o.**.**      SEL
256f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
25700 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
25710 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20  =39 AND t2.b=39 
25720 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a  AND t3.c=39.**.*
25730 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
25740 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74   any transformat
25750 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20  ions where made 
25760 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
25770 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
25780 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f  tation note:  Co
25790 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
257a0 6f 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65  on is tricky due
257b0 20 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20   to affinity.** 
257c0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
257d0 71 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69  quence interacti
257e0 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  ons.  Consider t
257f0 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  his example:.**.
25800 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  **    CREATE TAB
25810 4c 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45  LE t1(a INT,b TE
25820 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52  XT);.**    INSER
25830 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
25840 28 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a  (123,'0123');.**
25850 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25860 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33  M t1 WHERE a=123
25870 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20   AND b=a;.**    
25880 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25890 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44   WHERE a=123 AND
258a0 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68   b=123;.**.** Th
258b0 65 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61  e two SELECT sta
258c0 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68  tements above sh
258d0 6f 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66  ould return diff
258e0 65 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20  erent answers.  
258f0 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20  b=a.** is alway 
25900 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
25910 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73   comparison uses
25920 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
25930 79 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20  y, but b=123.** 
25940 69 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65  is false because
25950 20 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66   it uses text af
25960 66 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33  finity and '0123
25970 27 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  ' is not the sam
25980 65 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54  e as '123'..** T
25990 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
259a0 69 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  is, the expressi
259b0 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61  on tree is not a
259c0 63 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20  ctually changed 
259d0 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f  from.** "b=a" to
259e0 20 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74   "b=123" but rat
259f0 68 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22  her the "a" in "
25a00 62 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77  b=a" is tagged w
25a10 69 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a  ith EP_FixedCol.
25a20 2a 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22  ** and the "123"
25a30 20 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f   value is hung o
25a40 66 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ff of the pLeft 
25a50 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67  pointer.  Code g
25a60 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74  enerator.** rout
25a70 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e  ines know to gen
25a80 65 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61  erate the consta
25a90 6e 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64  nt "123" instead
25aa0 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74   of looking up t
25ab0 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c  he.** column val
25ac0 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76  ue.  Also, to av
25ad0 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72  oid collation pr
25ae0 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74  oblems, this opt
25af0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20  imization is.** 
25b00 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
25b10 66 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65  f the "a=123" te
25b20 72 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61  rm uses the defa
25b30 75 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  ult BINARY colla
25b40 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
25b50 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  int propagateCon
25b60 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20  stants(.  Parse 
25b70 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68  *pParse,   /* Th
25b80 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
25b90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
25ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
25bb0 75 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  uery in which to
25bc0 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74   propagate const
25bd0 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ants */.){.  Whe
25be0 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c  reConst x;.  Wal
25bf0 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68  ker w;.  int nCh
25c00 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72  ng = 0;.  x.pPar
25c10 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64  se = pParse;.  d
25c20 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20  o{.    x.nConst 
25c30 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67  = 0;.    x.nChng
25c40 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78   = 0;.    x.apEx
25c50 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64  pr = 0;.    find
25c60 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c  ConstInWhere(&x,
25c70 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
25c80 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b   if( x.nConst ){
25c90 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77  .      memset(&w
25ca0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
25cb0 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20  .      w.pParse 
25cc0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
25cd0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
25ce0 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  = propagateConst
25cf0 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a  antExprRewrite;.
25d00 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25d10 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
25d20 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
25d30 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74  .      w.xSelect
25d40 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
25d50 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70       w.walkerDep
25d60 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e  th = 0;.      w.
25d70 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20  u.pConst = &x;. 
25d80 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25d90 45 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65  Expr(&w, p->pWhe
25da0 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
25db0 65 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73  e3DbFree(x.pPars
25dc0 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29  e->db, x.apExpr)
25dd0 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d  ;.      nChng +=
25de0 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a   x.nChng;.    }.
25df0 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e    }while( x.nChn
25e00 67 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  g );  .  return 
25e10 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64  nChng;.}..#if !d
25e20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25e30 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
25e40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25e50 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
25e60 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
25e70 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
25e80 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
25e90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
25ea0 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
25eb0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
25ec0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
25ed0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
25ee0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
25ef0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
25f00 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
25f10 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
25f20 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
25f30 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
25f40 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
25f50 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
25f60 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
25f70 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
25f80 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
25f90 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
25fa0 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
25fb0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
25fc0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
25fd0 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
25fe0 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
25ff0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
26000 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
26010 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
26020 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a  :.**.**   (1) (*
26030 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  * This restricti
26040 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f  on was removed o
26050 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57  n 2017-09-29.  W
26060 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20  e used to.**    
26070 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20         disallow 
26080 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
26090 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  n for aggregate 
260a0 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20  subqueries, but 
260b0 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
260c0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62   it is allowed b
260d0 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78  y putting the ex
260e0 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
260f0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a   HAVING clause..
26100 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65  **           The
26110 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c   added HAVING cl
26120 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73  ause is pointles
26130 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  s if the subquer
26140 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20  y lacks.**      
26150 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20       a GROUP BY 
26160 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63  clause.  But suc
26170 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  h a HAVING claus
26180 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65  e is also harmle
26190 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
261a0 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f  so there does no
261b0 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
261c0 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64  ny reason to add
261d0 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20   extra logic.** 
261e0 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70            to sup
261f0 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a  press it. **).**
26200 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
26210 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
26220 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
26230 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
26240 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
26250 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
26260 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
26270 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
26280 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
26290 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
262a0 20 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75        clause wou
262b0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
262c0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
262d0 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
262e0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
262f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
26300 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
26310 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20  JOIN and the.** 
26320 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
26330 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f   to be pushed do
26340 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  wn does not come
26350 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
26360 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20  use.**       on 
26370 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  that LEFT JOIN..
26380 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
26390 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
263a0 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
263b0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
263c0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
263d0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
263e0 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73  JOIN where iCurs
263f0 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  or is not the ri
26400 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
26410 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  f that.**       
26420 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65  left join.  An e
26430 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
26440 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
26450 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52  .**           FR
26460 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  OM (SELECT 1 AS 
26470 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  a1 UNION ALL SEL
26480 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20  ECT 2) AS aa.** 
26490 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28            JOIN (
264a0 53 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55  SELECT 1 AS b2 U
264b0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
264c0 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d  2) AS bb ON (a1=
264d0 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  b2).**          
264e0 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45   LEFT JOIN (SELE
264f0 43 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e  CT 8 AS c3 UNION
26500 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41   ALL SELECT 9) A
26510 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a  S cc ON (b2=2);.
26520 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  **.**       The 
26530 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69  correct answer i
26540 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28  s three rows:  (
26550 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38  1,1,NULL),(2,2,8
26560 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20  ),(2,2,9)..**   
26570 20 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28      But if the (
26580 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20  b2=2) term were 
26590 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
265a0 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75  n into the bb su
265b0 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20  bquery,.**      
265c0 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e   then the (1,1,N
265d0 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62  ULL) row would b
265e0 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a  e suppressed..**
265f0 0a 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e  .**   (6) The in
26600 6e 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72  ner query featur
26610 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77  es one or more w
26620 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
26630 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20  (since .**      
26640 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
26650 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
26660 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
26670 63 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  could change the
26680 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f   .**       windo
26690 77 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e  w over which win
266a0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
266b0 65 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a  e calculated)..*
266c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
266d0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
266e0 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
266f0 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
26700 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
26710 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
26720 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
26730 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
26740 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
26750 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72  hereTerms(.  Par
26760 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
26770 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
26780 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28  ext (for malloc(
26790 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f  ) and error repo
267a0 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65  rting) */.  Sele
267b0 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
267c0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
267d0 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
267e0 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
267f0 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
26800 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
26810 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
26820 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
26830 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
26840 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20  nt iCursor,     
26850 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
26860 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
26870 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
26880 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20  sLeftJoin       
26890 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62   /* True if pSub
268a0 71 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  q is the right t
268b0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
268c0 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  IN */.){.  Expr 
268d0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
268e0 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  ng = 0;.  if( pW
268f0 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  here==0 ) return
26900 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d   0;.  if( pSubq-
26910 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
26920 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72  ecursive ) retur
26930 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63  n 0;  /* restric
26940 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66  tion (2) */..#if
26950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26960 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66  _WINDOWFUNC.  if
26970 28 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20  ( pSubq->pWin ) 
26980 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
26990 72 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  restriction (6) 
269a0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  */.#endif..#ifde
269b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
269c0 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72   /* Only the fir
269d0 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d  st term of a com
269e0 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61  pound can have a
269f0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42   WITH clause.  B
26a00 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  ut make.  ** sur
26a10 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73  e no other terms
26a20 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52   are marked SF_R
26a30 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65  ecursive in case
26a40 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67   something chang
26a50 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  es.  ** in the f
26a60 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  uture..  */.  {.
26a70 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20      Select *pX; 
26a80 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75   .    for(pX=pSu
26a90 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  bq; pX; pX=pX->p
26aa0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73  Prior){.      as
26ab0 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c  sert( (pX->selFl
26ac0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
26ad0 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ive))==0 );.    
26ae0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26af0 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
26b00 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
26b10 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
26b20 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
26b30 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
26b40 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
26b50 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
26b60 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
26b70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57  Parse, pSubq, pW
26b80 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20  here->pRight,.  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
26bb0 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69  ursor, isLeftJoi
26bc0 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  n);.    pWhere =
26bd0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
26be0 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74    }.  if( isLeft
26bf0 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72  Join.   && (Expr
26c00 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
26c10 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d  re,EP_FromJoin)=
26c20 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
26c30 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
26c40 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29  nTable!=iCursor)
26c50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
26c60 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26c70 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (4) */.  }.  
26c80 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
26c90 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
26ca0 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72  omJoin) && pWher
26cb0 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
26cc0 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le!=iCursor ){. 
26cd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
26ce0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  restriction (5) 
26cf0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  */.  }.  if( sql
26d00 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
26d10 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
26d20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
26d30 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
26d40 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
26d50 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
26d60 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
26d70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
26d80 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
26d90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73  e, 0);.      uns
26da0 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c  etJoinExpr(pNew,
26db0 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50   -1);.      x.pP
26dc0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26dd0 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
26de0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
26df0 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75  .iNewTable = iCu
26e00 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73  rsor;.      x.is
26e10 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20  LeftJoin = 0;.  
26e20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
26e30 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Subq->pEList;.  
26e40 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
26e50 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a  Expr(&x, pNew);.
26e60 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d        if( pSubq-
26e70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
26e80 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
26e90 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69      pSubq->pHavi
26ea0 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
26eb0 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
26ec0 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20  pSubq->pHaving, 
26ed0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pNew);.      }el
26ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62  se{.        pSub
26ef0 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
26f00 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
26f10 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57  e->db, pSubq->pW
26f20 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
26f30 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71     }.      pSubq
26f40 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
26f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26f60 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
26f70 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
26f80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
26f90 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
26fa0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26fb0 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IEW) */../*.** T
26fc0 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20  he pFunc is the 
26fd0 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66  only aggregate f
26fe0 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71  unction in the q
26ff0 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20  uery.  Check to 
27000 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75  see.** if the qu
27010 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27020 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27030 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ax optimization.
27040 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71   .**.** If the q
27050 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
27060 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
27070 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
27080 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70  , then set.** *p
27090 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e  pMinMax to be an
270a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
270b0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
270c0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
270d0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65  .** and return e
270e0 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45  ither WHERE_ORDE
270f0 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
27100 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70  _ORDERBY_MAX dep
27110 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65  ending on.** whe
27120 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20  ther pFunc is a 
27130 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
27140 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
27150 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e  f the query is n
27160 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  ot a candidate f
27170 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
27180 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74  ptimization, ret
27190 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  urn.** WHERE_ORD
271a0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69  ERBY_NORMAL (whi
271b0 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29  ch must be zero)
271c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
271d0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
271e0 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67  led after aggreg
271f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ate functions ha
27200 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74  ve been.** locat
27210 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27220 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61  eir arguments ha
27230 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65  ve been subjecte
27240 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a  d to aggregate.*
27250 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73  * analysis..*/.s
27260 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
27270 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  uery(sqlite3 *db
27280 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45  , Expr *pFunc, E
27290 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
272a0 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
272b0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
272c0 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20  NORMAL;      /* 
272d0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
272e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
272f0 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c  st = pFunc->x.pL
27300 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d  ist;    /* Argum
27310 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
27320 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
27330 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20  char *zFunc;    
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65  /* Name of aggre
27360 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46  gate function pF
27370 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  unc */.  ExprLis
27380 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75  t *pOrderBy;.  u
27390 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  8 sortOrder;..  
273a0 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
273b0 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
273c0 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f  ( pFunc->op==TK_
273d0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
273e0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
273f0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
27400 21 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65  !=1 ) return eRe
27410 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75  t;.  zFunc = pFu
27420 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  nc->u.zToken;.  
27430 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
27440 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
27450 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
27460 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
27470 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MIN;.    sortOrd
27480 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41  er = SQLITE_SO_A
27490 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SC;.  }else if( 
274a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
274b0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
274c0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
274d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
274e0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
274f0 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
27500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
27510 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20  turn eRet;.  }. 
27520 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72   *ppMinMax = pOr
27530 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
27540 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
27550 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73  EList, 0);.  ass
27560 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
27570 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
27580 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f  iled );.  if( pO
27590 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
275a0 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
275b0 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
275c0 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
275d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
275e0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
275f0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
27600 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
27610 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
27620 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
27630 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
27640 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
27650 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
27660 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
27670 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
27680 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
27690 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
276a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
276b0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
276c0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
276d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
276e0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
276f0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
27700 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
27710 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
27720 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
27730 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
27740 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
27750 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
27760 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
27770 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
27780 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
27790 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
277a0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
277b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
277c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
277d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
277e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
277f0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
27800 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
27810 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
27820 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
27830 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
27840 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
27850 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
27860 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
27870 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
27880 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
27890 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
278a0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
278b0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
278c0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
278d0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
278e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
278f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
27900 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
27910 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
27920 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
27930 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
27940 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
27950 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
27960 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
27970 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
27980 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
27990 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
279a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
279b0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
279c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
279d0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
279e0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
279f0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
27a00 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
27a10 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
27a20 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
27a30 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
27a40 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
27a50 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
27a60 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
27a70 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
27a80 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
27a90 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
27aa0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
27ab0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
27ac0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
27ad0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
27ae0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
27af0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
27b00 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
27b10 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
27b20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27b30 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
27b40 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
27b50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
27b60 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
27b70 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
27b80 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
27b90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27ba0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27bb0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
27bc0 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
27bd0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
27be0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
27bf0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
27c00 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
27c10 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
27c20 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
27c30 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
27c40 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
27c50 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
27c60 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
27c70 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
27c80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27c90 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
27ca0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
27cb0 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
27cc0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
27cd0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
27ce0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
27d00 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
27d10 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
27d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
27d30 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
27d40 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
27d50 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
27d60 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
27d70 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
27d80 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
27d90 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
27da0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
27db0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
27dc0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27dd0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
27de0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
27df0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
27e00 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
27e10 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
27e20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
27e30 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
27e40 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
27e50 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
27e60 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
27e70 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
27e80 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27e90 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
27ea0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
27eb0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
27ec0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
27ed0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
27ee0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
27ef0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
27f00 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
27f10 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
27f20 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
27f30 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
27f40 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
27f50 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
27f60 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
27f70 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
27f80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27f90 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
27fa0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
27fb0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
27fc0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
27fd0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27fe0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
27ff0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
28000 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
28010 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
28020 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
28030 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
28040 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
28050 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
28060 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
28070 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
28080 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
28090 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
280a0 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
280b0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
280c0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
280d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
280e0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
280f0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
28100 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
28110 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
28120 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
28130 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
28140 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
28150 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
28160 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
28170 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28180 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
28190 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
281a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
281b0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
281c0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
281d0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
281e0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
281f0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
28200 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
28210 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
28220 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
28230 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
28240 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
28250 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28260 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
28270 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
28280 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
28290 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
282a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
282b0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
282c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
282d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
282e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
282f0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
28300 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
28310 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
28320 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28330 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
28340 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28350 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
28360 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
28370 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28380 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
28390 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
283a0 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
283b0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
283c0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
283d0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
283e0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
283f0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
28400 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
28410 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
28420 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
28430 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
28440 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
28450 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
28460 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
28470 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
28480 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
28490 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
284a0 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
284b0 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
284c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
284d0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
284e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
284f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
28500 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
28510 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
28520 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
28530 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
28540 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28550 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
28560 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
28570 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
28580 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
28590 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
285a0 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
285b0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
285c0 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
285d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74  Limit = 0;.  ret
285e0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
285f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
28600 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
28610 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
28620 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
28630 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
28640 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
28650 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
28660 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28670 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
28680 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
28690 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
286a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
286b0 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
286c0 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
286d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
286e0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
286f0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
28700 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28710 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
28720 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
28730 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
28740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28750 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
28760 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
28770 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
28780 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28790 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
287a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
287b0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
287c0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
287d0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
287e0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
287f0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
28800 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
28810 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
28820 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
28830 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
28840 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
28850 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
28860 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
28870 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
28880 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
28890 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
288a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
288b0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
288c0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
288d0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
288e0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
288f0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
28900 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
28910 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
28920 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
28930 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
28940 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
28950 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
28960 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
28970 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
28980 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
289b0 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
289c0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
289d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
289e0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
289f0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
28a00 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
28a10 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
28a40 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
28a50 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
28a60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28a70 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
28a80 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
28a90 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
28aa0 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
28ab0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
28ac0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
28ad0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
28ae0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
28b00 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
28b10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28b20 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
28b30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
28b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
28b50 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
28b60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
28b70 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
28b80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28ba0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
28bb0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
28bc0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
28bd0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
28be0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
28bf0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
28c00 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
28c10 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
28c20 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
28c30 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
28c40 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
28c50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28c60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
28c70 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
28c80 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
28c90 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
28ca0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
28cb0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
28cc0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
28cd0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
28ce0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
28cf0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
28d00 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
28d10 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
28d20 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
28d30 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
28d40 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
28d50 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
28d60 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
28d70 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
28d80 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
28d90 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
28da0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
28db0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
28dc0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
28dd0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
28de0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
28df0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
28e00 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
28e10 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
28e20 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
28e30 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
28e40 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
28e50 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
28e60 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
28e70 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
28e80 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
28e90 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
28ea0 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
28eb0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
28ec0 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
28ed0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28ee0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
28ef0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
28f00 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
28f10 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
28f20 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
28f30 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
28f40 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
28f50 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
28f60 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
28f70 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
28f80 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
28f90 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
28fa0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
28fb0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
28fc0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
28fd0 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
28fe0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
28ff0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
29000 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
29010 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
29020 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
29030 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
29040 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
29050 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
29060 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
29070 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
29080 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
29090 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
290a0 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
290b0 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
290c0 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
290d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
290e0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
290f0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
29100 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
29110 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
29120 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
29130 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
29140 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
29150 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29160 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
29170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29180 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
29190 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
291a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
291b0 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
291c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
291d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
291e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
291f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
29200 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29220 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
29230 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
29240 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
29250 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
29260 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
29270 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
29280 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
29290 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
292a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
292b0 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
292c0 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
292d0 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
292e0 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
292f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
29300 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
29310 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
29320 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
29330 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
29340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
29350 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
29360 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
29370 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
29380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29390 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
293a0 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
293b0 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
293c0 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
293d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
293e0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
293f0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
29400 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
29410 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
29420 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
29430 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
29440 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
29450 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
29460 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
29470 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
29480 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
29490 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
294a0 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
294b0 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
294c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
294d0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
294e0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
294f0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
29500 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
29510 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
29520 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29530 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29540 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
29550 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
29560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29570 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29580 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
29590 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
295a0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
295b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
295c0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
295d0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
295e0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
295f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
29600 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
29610 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
29620 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
29630 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29640 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
29650 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
29660 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
29670 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
29680 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29690 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
296a0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
296b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
296c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
296d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
296e0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
296f0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
29700 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
29710 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
29720 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
29730 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
29740 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
29750 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
29760 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29770 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
29780 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
29790 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
297a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
297b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
297c0 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
297d0 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
297e0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
297f0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
29800 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
29810 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
29820 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
29830 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
29840 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
29850 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29860 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
29870 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29880 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
29890 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
298a0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
298b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
298c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
298d0 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
298e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
298f0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
29900 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
29910 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
29920 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
29930 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
29940 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
29950 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
29960 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
29970 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
29980 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29990 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
299a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
299b0 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
299c0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
299d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
299e0 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
299f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29a00 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
29a10 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
29a20 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
29a30 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
29a40 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
29a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29a60 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
29a70 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
29a80 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
29a90 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
29aa0 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
29ab0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
29ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29ad0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
29ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
29af0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
29b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
29b10 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
29b20 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
29b30 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
29b40 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
29b50 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
29b60 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
29b70 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
29b80 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
29b90 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
29ba0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
29bb0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29bc0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
29bd0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
29be0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
29bf0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
29c00 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
29c10 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
29c20 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
29c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
29c40 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
29c50 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
29c60 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
29c70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29c90 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29ca0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29cb0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29cc0 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
29cd0 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
29ce0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
29cf0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
29d00 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
29d10 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
29d20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
29d30 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
29d40 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
29d50 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
29d60 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
29d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
29d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29d90 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
29da0 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
29db0 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
29dc0 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
29dd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
29de0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
29df0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
29e00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
29e10 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
29e20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29e30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
29e50 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
29e60 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
29e70 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
29e80 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
29e90 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
29ea0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
29eb0 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
29ec0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29ed0 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
29ee0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
29ef0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
29f00 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
29f10 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
29f20 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
29f30 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
29f40 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
29f50 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
29f60 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
29f70 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
29f80 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
29f90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29fa0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
29fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
29fc0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
29fd0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29fe0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
29ff0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a000 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a010 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2a020 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
2a030 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
2a040 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a050 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
2a060 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
2a070 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
2a080 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
2a090 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
2a0a0 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
2a0b0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
2a0c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a0d0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
2a0e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
2a0f0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
2a100 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2a110 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
2a120 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
2a130 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
2a140 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
2a150 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
2a160 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
2a170 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2a180 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
2a190 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2a1a0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2a1b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2a1c0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2a1d0 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2a1e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26  pParse->pWith) &
2a1f0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  & p->pPrior==0 )
2a200 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74  {.    With *pWit
2a210 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  h = findRightmos
2a220 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20  t(p)->pWith;.   
2a230 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
2a240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a250 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
2a260 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ith );.      pPa
2a270 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
2a280 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  th->pOuter;.    
2a290 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
2a2a0 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
2a2b0 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
2a2c0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f  .** The SrcList_
2a2d0 69 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70  item structure p
2a2e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a2f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70  ond argument rep
2a300 72 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62  resents a.** sub
2a310 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2a320 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2a330 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2a340 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
2a350 2a 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  * allocates and 
2a360 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72  populates the Sr
2a370 63 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20  cList_item.pTab 
2a380 6f 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65  object. If succe
2a390 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45  ssful,.** SQLITE
2a3a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a3b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2a3c0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
2a3d0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53  ncountered,.** S
2a3e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2a3f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e  int sqlite3Expan
2a400 64 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20  dSubquery(Parse 
2a410 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
2a420 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2a430 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  rom){.  Select *
2a440 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2a450 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a  elect;.  Table *
2a460 70 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  pTab;..  assert(
2a470 20 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d   pSel );.  pFrom
2a480 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
2a490 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2a4a0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
2a4b0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
2a4c0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2a4d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a4e0 4d 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  MEM;.  pTab->nTa
2a4f0 62 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  bRef = 1;.  if( 
2a500 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pFrom->zAlias ){
2a510 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a520 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2a530 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2a540 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  From->zAlias);. 
2a550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
2a560 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a570 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
2a580 3e 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25  >db, "subquery_%
2a590 75 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29  u", pSel->selId)
2a5a0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
2a5b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
2a5c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
2a5d0 6f 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  or; }.  sqlite3C
2a5e0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
2a5f0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
2a600 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
2a610 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
2a620 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
2a630 3d 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  = -1;.  pTab->nR
2a640 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
2a650 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
2a660 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
2a670 37 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74  76) );.  pTab->t
2a680 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
2a690 68 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75  hemeral;..  retu
2a6a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a6b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a6c0 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
2a6d0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
2a6e0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
2a6f0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2a700 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
2a710 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
2a720 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
2a730 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
2a740 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2a750 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
2a760 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
2a770 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
2a780 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
2a790 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
2a7a0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
2a7b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
2a7c0 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
2a7d0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
2a7e0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
2a7f0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
2a800 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
2a810 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2a820 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
2a830 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
2a840 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
2a850 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
2a860 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
2a870 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
2a880 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
2a890 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
2a8a0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
2a8b0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
2a8c0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
2a8d0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
2a8e0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
2a8f0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
2a900 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a910 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
2a920 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
2a930 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
2a940 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
2a950 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
2a960 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
2a970 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
2a980 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2a990 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
2a9a0 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
2a9b0 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
2a9c0 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
2a9d0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
2a9e0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
2a9f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
2aa00 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
2aa10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
2aa20 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
2aa30 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
2aa40 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
2aa50 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
2aa60 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
2aa70 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
2aa80 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
2aa90 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
2aaa0 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
2aab0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
2aac0 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
2aad0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
2aae0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
2aaf0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
2ab00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
2ab10 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
2ab20 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2ab30 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2ab40 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
2ab50 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
2ab60 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
2ab70 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
2ab80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2ab90 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2aba0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2abb0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2abc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2abd0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
2abe0 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
2abf0 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
2ac00 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65  elFlags;.  u32 e
2ac10 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a  listFlags = 0;..
2ac20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2ac30 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
2ac40 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ac50 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
2ac60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2ac70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2ac80 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
2ac90 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
2aca0 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
2acb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2acc0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
2acd0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2ace0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2acf0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
2ad00 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
2ad10 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20  p->pWith, 0);.. 
2ad20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
2ad30 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
2ad40 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
2ad50 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
2ad60 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
2ad70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2ad80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2ad90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
2ada0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
2adb0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
2adc0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
2add0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
2ade0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
2adf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2ae00 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
2ae10 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2ae20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2ae30 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
2ae40 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
2ae50 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
2ae60 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
2ae70 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
2ae80 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
2ae90 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
2aea0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
2aeb0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2aec0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2aed0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2aee0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2aef0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2af00 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
2af10 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
2af20 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
2af30 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
2af40 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
2af50 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2af60 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2af70 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2af80 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
2af90 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
2afa0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
2afb0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2afc0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
2afd0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
2afe0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2aff0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
2b000 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2b010 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b020 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b030 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b040 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
2b050 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2b060 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b070 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
2b080 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
2b090 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b0a0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2b0b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b0c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b0d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
2b0e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b0f0 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ort;.      if( s
2b100 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2b110 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72  uery(pParse, pFr
2b120 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2b130 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20  _Abort;.#endif. 
2b140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b150 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
2b160 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
2b170 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2b180 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
2b190 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
2b1a0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
2b1b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
2b1c0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2b1d0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
2b1e0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
2b1f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
2b200 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b210 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
2b220 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
2b230 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
2b240 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b250 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2b260 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
2b270 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
2b280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
2b290 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b2a0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b2b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2b2c0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
2b2e0 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
2b2f0 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
2b300 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
2b310 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
2b320 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
2b330 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b340 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2b350 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b360 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
2b370 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
2b380 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b390 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
2b3a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b3b0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
2b3d0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nCol;.        if
2b3e0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
2b3f0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2b400 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
2b410 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
2b430 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
2b440 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
2b450 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
2b460 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
2b470 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
2b480 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  0);.        nCol
2b490 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
2b4a0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2b4b0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
2b4c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b4d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
2b4e0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2b4f0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
2b500 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
2b510 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2b520 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
2b530 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
2b540 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
2b550 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
2b560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
2b570 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
2b580 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
2b590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2b5a0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
2b5b0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
2b5c0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
2b5d0 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
2b5e0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
2b5f0 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
2b600 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b610 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
2b620 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
2b630 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b640 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
2b650 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
2b660 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
2b670 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
2b680 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
2b690 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
2b6a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
2b6b0 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
2b6c0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
2b6d0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
2b6e0 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
2b6f0 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
2b700 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
2b710 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
2b720 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
2b730 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
2b740 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
2b750 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
2b760 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
2b770 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
2b780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
2b790 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
2b7a0 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
2b7b0 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
2b7c0 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
2b7d0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
2b7e0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
2b7f0 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
2b800 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
2b810 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
2b820 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
2b830 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2b840 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
2b850 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
2b860 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
2b870 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
2b880 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
2b890 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
2b8a0 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
2b8b0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
2b8c0 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
2b8d0 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
2b8e0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
2b8f0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
2b900 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b910 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2b920 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
2b930 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
2b940 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
2b950 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2b960 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
2b970 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
2b980 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
2b990 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
2b9a0 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  E->flags;.  }.  
2b9b0 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
2b9c0 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
2b9d0 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
2b9e0 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
2b9f0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
2ba00 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
2ba10 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
2ba20 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
2ba30 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
2ba40 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
2ba50 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
2ba60 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
2ba70 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
2ba80 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
2ba90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
2baa0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2bab0 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
2bac0 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
2bad0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
2bae0 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
2baf0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
2bb00 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
2bb10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2bb20 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
2bb30 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2bb40 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
2bb50 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
2bb60 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
2bb70 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2bb80 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2bb90 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
2bba0 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
2bbb0 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
2bbc0 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  E->flags;.      
2bbd0 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
2bbe0 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
2bbf0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
2bc00 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
2bc10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
2bc20 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a  op!=TK_ASTERISK.
2bc30 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f         && (pE->o
2bc40 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
2bc50 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45  ght->op!=TK_ASTE
2bc60 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  RISK).      ){. 
2bc70 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
2bc80 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
2bc90 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
2bca0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
2bcb0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
2bcc0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2bcd0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2bce0 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
2bcf0 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
2bd00 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2bd10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
2bd20 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2bd30 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
2bd40 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2bd50 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
2bd60 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
2bd70 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
2bd80 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
2bd90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bda0 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
2bdb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bdc0 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
2bdd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bde0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
2bdf0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
2be00 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
2be10 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
2be20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
2be30 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
2be40 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
2be50 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
2be60 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
2be70 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
2be80 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
2be90 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
2bea0 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
2beb0 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
2bec0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
2bed0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
2bee0 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
2bef0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2bf00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2bf10 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
2bf20 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
2bf30 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2bf40 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
2bf50 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
2bf60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf70 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2bf80 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2bf90 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2bfa0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2bfb0 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
2bfc0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
2bfd0 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
2bfe0 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
2bff0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2c000 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
2c010 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
2c020 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
2c030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
2c040 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
2c050 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
2c060 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
2c070 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
2c080 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
2c090 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
2c0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c0b0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2c0c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
2c0d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
2c0e0 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
2c0f0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2c100 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
2c110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c120 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
2c130 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2c140 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2c150 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
2c160 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
2c170 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c180 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2c190 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
2c1a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2c1b0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2c1c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2c1d0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
2c1e0 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
2c1f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
2c200 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
2c210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c220 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
2c230 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2c240 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2c250 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
2c260 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2c270 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c280 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
2c290 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
2c2a0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
2c2b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
2c2c0 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
2c2d0 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
2c2e0 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
2c2f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c300 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
2c310 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
2c320 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
2c330 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
2c340 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
2c350 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
2c360 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
2c370 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
2c380 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
2c390 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
2c3a0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
2c3b0 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
2c3c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2c3d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c3e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c3f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c400 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
2c410 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
2c420 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74  s 'hidden', omit
2c430 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70   it from the exp
2c440 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
2c450 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
2c460 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20  list unless the 
2c470 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53  SELECT has the S
2c480 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a  F_IncludeHidden.
2c490 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2c4a0 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20  it set..        
2c4b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2c4c0 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c     if( (p->selFl
2c4d0 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65  ags & SF_Include
2c4e0 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20  Hidden)==0.     
2c4f0 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64          && IsHid
2c500 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
2c510 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20  >aCol[j]) .     
2c520 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2c530 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c550 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
2c560 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
2c570 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
2c580 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c5a0 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69  ( (pFrom->fg.joi
2c5b0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
2c5c0 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
2c5d0 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
2c5e0 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
2c5f0 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
2c600 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
2c610 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c620 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
2c630 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
2c640 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
2c650 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2c670 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
2c680 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
2c690 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c6a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c6d0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
2c6e0 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
2c6f0 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c710 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
2c720 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
2c730 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
2c740 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
2c750 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
2c760 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
2c770 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
2c780 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2c790 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c7b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c7c0 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
2c7d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2c7e0 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
2c7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
2c800 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
2c810 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
2c820 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
2c830 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
2c840 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
2c850 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
2c860 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
2c870 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
2c880 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
2c890 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2c8a0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
2c8b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2c8c0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c8d0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
2c8e0 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c900 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
2c930 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
2c940 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2c960 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2c970 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
2c980 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  , pLeft, pExpr);
2c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2c9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2c9b0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
2c9e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2c9f0 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
2ca00 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2ca10 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
2ca20 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
2ca30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ca40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2ca60 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
2ca70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca80 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2ca90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2caa0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
2cab0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
2cac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
2cad0 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
2cae0 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
2caf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cb00 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
2cb10 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
2cb20 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
2cb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
2cb40 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
2cb50 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
2cb60 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
2cb70 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2cb80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
2cb90 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
2cba0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
2cbb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2cbc0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2cbd0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
2cbe0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2cbf0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
2cc00 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
2cc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cc20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
2cc30 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
2cc40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2cc70 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
2cc80 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
2ccc0 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
2ccd0 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2cce0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ccf0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
2cd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cd10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2cd20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
2cd30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2cd40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2cd50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2cd60 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
2cd70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cd80 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
2cd90 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
2cda0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
2cdb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2cdc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2cdd0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2cde0 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
2cdf0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
2ce00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ce10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2ce20 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
2ce30 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
2ce40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ce50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ce60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ce70 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2ce80 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
2ce90 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
2cea0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2ceb0 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  EList ){.    if(
2cec0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
2ced0 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
2cee0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
2cef0 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
2cf00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2cf10 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
2cf20 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
2cf30 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  et");.      retu
2cf40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2cf50 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69    }.    if( (eli
2cf60 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61  stFlags & (EP_Ha
2cf70 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72  sFunc|EP_Subquer
2cf80 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  y))!=0 ){.      
2cf90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2cfa0 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b  F_ComplexResult;
2cfb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2cfc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2cfd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
2cfe0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
2cff0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
2d000 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
2d010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2d020 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
2d030 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
2d040 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
2d050 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
2d060 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
2d070 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
2d080 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
2d090 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
2d0a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2d0b0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
2d0c0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
2d0d0 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
2d0e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
2d0f0 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
2d100 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
2d110 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
2d120 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2d130 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2d140 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d150 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2d160 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
2d170 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d180 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d190 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
2d1a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d1b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
2d1c0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
2d1d0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
2d1e0 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  er for SELECT st
2d1f0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62  atements..** sub
2d200 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
2d210 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
2d220 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2d230 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
2d240 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
2d250 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2d260 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2d270 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2d280 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
2d290 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
2d2a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2d2b0 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72  .** Always asser
2d2c0 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74  t.  This xSelect
2d2d0 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d  Callback2 implem
2d2e0 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20  entation proves 
2d2f0 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c  that the.** xSel
2d300 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20  ectCallback2 is 
2d310 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a  never invoked..*
2d320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
2d330 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28  lectWalkAssert2(
2d340 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d350 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
2d360 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
2d370 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
2d380 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73   NotUsed2);.  as
2d390 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e  sert( 0 );.}.#en
2d3a0 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  dif./*.** This r
2d3b0 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
2d3c0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2d3d0 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
2d3e0 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
2d3f0 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
2d400 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2d410 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
2d420 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
2d430 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
2d440 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
2d450 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
2d460 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
2d470 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
2d480 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
2d490 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
2d4a0 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
2d4b0 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
2d4c0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
2d4d0 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
2d4e0 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
2d4f0 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
2d500 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
2d510 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
2d520 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
2d530 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
2d540 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
2d550 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
2d560 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
2d570 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2d580 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
2d590 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
2d5a0 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
2d5b0 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
2d5c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2d5d0 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
2d5e0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2d5f0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
2d600 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2d610 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2d620 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2d630 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
2d640 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
2d650 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
2d660 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2d670 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2d680 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
2d690 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53  und) ){.    w.xS
2d6a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2d6b0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
2d6c0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
2d6d0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
2d6e0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
2d6f0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2d700 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2d710 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
2d720 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
2d730 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
2d740 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d750 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
2d760 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2d770 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2d780 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
2d790 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2d7a0 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
2d7b0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
2d7c0 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
2d7d0 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
2d7e0 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
2d7f0 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
2d800 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
2d810 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2d820 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
2d830 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
2d840 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
2d850 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
2d860 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
2d870 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
2d880 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
2d890 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
2d8a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
2d8b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2d8c0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d8d0 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
2d8e0 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
2d8f0 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
2d900 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
2d910 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
2d920 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
2d930 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
2d940 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
2d950 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
2d960 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
2d970 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
2d980 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d990 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
2d9a0 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
2d9b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
2d9c0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
2d9d0 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
2d9e0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2d9f0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2da00 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
2da10 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2da20 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2da30 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
2da40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
2da50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
2da60 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70  olved );.  if( p
2da70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2da80 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
2da90 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  turn;.  p->selFl
2daa0 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
2dab0 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  eInfo;.  pParse 
2dac0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2dad0 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  e;.  pTabList = 
2dae0 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->pSrc;.  for(i
2daf0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
2db00 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
2db10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
2db20 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
2db30 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2db40 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2db50 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2db60 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2db70 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2db80 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
2db90 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
2dba0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2dbb0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
2dbc0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
2dbd0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
2dbe0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
2dbf0 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
2dc00 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
2dc10 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
2dc20 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
2dc30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2dc40 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
2dc50 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
2dc60 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
2dc70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dc80 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
2dc90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2dca0 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
2dcb0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
2dcc0 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
2dcd0 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
2dce0 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
2dcf0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2dd00 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
2dd10 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2dd20 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
2dd30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
2dd40 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2dd50 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2dd60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
2dd70 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
2dd80 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2dd90 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
2dda0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ddb0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
2ddc0 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
2ddd0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2dde0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2ddf0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2de00 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41  lback2 = selectA
2de10 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2de20 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
2de30 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2de40 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2de50 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2de60 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2de70 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2de80 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
2de90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2dea0 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
2deb0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
2dec0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
2ded0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
2dee0 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
2def0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
2df00 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
2df10 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
2df20 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2df30 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
2df40 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
2df50 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
2df60 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
2df70 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2df80 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
2df90 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2dfa0 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
2dfb0 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
2dfc0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
2dfd0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
2dfe0 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
2dff0 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
2e000 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
2e010 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
2e020 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
2e030 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
2e040 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
2e050 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
2e060 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
2e070 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
2e080 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
2e090 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2e0a0 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
2e0b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2e0c0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2e0d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2e0e0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2e0f0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2e100 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2e110 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
2e120 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
2e130 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
2e140 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
2e150 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  er */.){.  asser
2e160 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73  t( p!=0 || pPars
2e170 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e180 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61  led );.  if( pPa
2e190 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2e1a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2e1b0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2e1c0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
2e1d0 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
2e1e0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2e1f0 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
2e200 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2e210 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2e220 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e230 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e240 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
2e250 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
2e260 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
2e270 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2e280 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e290 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e2a0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
2e2b0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
2e2c0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
2e2d0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
2e2e0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2e2f0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
2e300 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2e310 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
2e320 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
2e330 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
2e340 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
2e350 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
2e360 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
2e370 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2e380 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2e390 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
2e3a0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
2e3b0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
2e3c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e3d0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
2e3e0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2e3f0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2e400 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2e410 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2e420 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2e430 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2e440 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
2e450 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
2e460 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
2e470 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
2e480 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
2e490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2e4a0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
2e4b0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
2e4c0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
2e4d0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2e4e0 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
2e4f0 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
2e500 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
2e510 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
2e520 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
2e530 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
2e540 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
2e550 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2e560 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2e570 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2e580 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2e590 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2e5a0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2e5b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
2e5c0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2e5d0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
2e5e0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e5f0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
2e600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2e610 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2e620 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
2e630 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
2e640 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
2e650 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
2e660 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2e670 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
2e680 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2e690 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
2e6a0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
2e6b0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
2e6c0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
2e6d0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
2e6e0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2e6f0 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
2e700 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
2e710 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2e720 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2e730 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
2e740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e750 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e760 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
2e770 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2e780 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
2e790 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
2e7a0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
2e7b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2e7c0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
2e7d0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
2e7e0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
2e7f0 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
2e800 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
2e810 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
2e820 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2e830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e840 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2e850 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
2e860 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2e870 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
2e880 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20  pList,0,0);.    
2e890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e8a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2e8b0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
2e8c0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
2e8d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2e8f0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2e900 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2e910 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2e920 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
2e930 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
2e940 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
2e950 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2e960 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
2e970 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
2e980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e990 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2e9a0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
2e9b0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2e9c0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2e9d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2e9e0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2e9f0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2ea00 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
2ea10 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2ea20 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2ea30 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2ea40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
2ea50 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
2ea60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
2ea70 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2ea80 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
2ea90 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2eaa0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
2eab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2eac0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
2ead0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
2eae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2eaf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2eb00 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2eb10 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2eb20 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  DEF);.  }.}.../*
2eb30 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
2eb40 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
2eb50 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
2eb60 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
2eb70 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
2eb80 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2eb90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63  ..**.** If regAc
2eba0 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  c is non-zero an
2ebb0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  d there are no m
2ebc0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67  in() or max() ag
2ebd0 67 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70  gregates.** in p
2ebe0 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e  AggInfo, then on
2ebf0 6c 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ly populate the 
2ec00 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2ec10 75 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74  ulator accumulat
2ec20 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  or.** registers 
2ec30 69 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63  i register regAc
2ec40 63 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68  c contains 0. Th
2ec50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61  e caller will ta
2ec60 6b 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65  ke care.** of se
2ec70 74 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69  tting and cleari
2ec80 6e 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74  ng regAcc..*/.st
2ec90 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2eca0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2ecb0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72  e *pParse, int r
2ecc0 65 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a  egAcc, AggInfo *
2ecd0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2ece0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ecf0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2ed00 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
2ed10 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
2ed20 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
2ed30 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2ed40 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
2ed50 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
2ed60 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2ed70 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
2ed80 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2ed90 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2eda0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2edb0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
2edc0 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
2edd0 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
2ede0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
2edf0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2ee00 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2ee10 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2ee20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ee30 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2ee40 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2ee50 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
2ee60 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2ee70 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2ee80 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2ee90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2eea0 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2eeb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2eec0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2eed0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2eee0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2eef0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2ef00 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2ef10 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2ef20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2ef30 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2ef40 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2ef50 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2ef60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2ef70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ef80 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2ef90 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2efa0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2efb0 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2efc0 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2efd0 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2efe0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2eff0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2f000 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2f010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f020 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2f030 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2f040 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2f050 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2f060 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2f070 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2f080 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2f090 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2f0a0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2f0b0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2f0c0 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2f0d0 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2f0e0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2f0f0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2f100 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2f110 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2f120 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2f130 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2f140 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2f150 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2f160 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2f170 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2f180 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2f190 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2f1a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2f1b0 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2f1c0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2f1d0 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2f1e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2f1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f200 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2f210 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2f220 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2f230 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2f240 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2f250 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2f260 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
2f270 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  , pF->iMem);.   
2f280 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2f290 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2f2a0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2f2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f2c0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
2f2d0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2f2e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f2f0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2f300 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2f310 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2f320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2f330 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2f340 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
2f350 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d   }.  if( regHit=
2f360 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
2f370 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a  nAccumulator ){.
2f380 20 20 20 20 72 65 67 48 69 74 20 3d 20 72 65 67      regHit = reg
2f390 41 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  Acc;.  }.  if( r
2f3a0 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
2f3b0 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
2f3c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2f3d0 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
2f3e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f3f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
2f400 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2f410 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2f420 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2f430 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2f440 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2f450 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2f460 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2f470 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2f480 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  tMode = 0;.  if(
2f490 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2f4a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2f4b0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2f4c0 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2f4d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2f4e0 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2f4f0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2f500 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2f510 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2f520 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2f530 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2f540 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2f550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f560 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2f570 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2f580 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2f590 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f5b0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2f5c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5e0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2f5f0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2f600 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f620 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2f630 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2f640 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2f650 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2f660 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2f670 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2f680 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2f690 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2f6a0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2f6b0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
2f6c0 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73  dbeExplain(pPars
2f6d0 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c  e, 0, "SCAN TABL
2f6e0 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
2f6f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
2f700 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f710 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
2f720 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
2f730 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f740 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
2f750 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  ".    );.  }.}.#
2f760 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
2f770 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2f780 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
2f790 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
2f7a0 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
2f7b0 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54   used by havingT
2f7c0 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  oWhere()..**.** 
2f7d0 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73  If the node pass
2f7e0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
2f7f0 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e  ck is a TK_AND n
2f800 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ode, return .** 
2f810 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20  WRC_Continue to 
2f820 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b  tell sqlite3Walk
2f830 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74  Expr() to iterat
2f840 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20  e through child 
2f850 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  nodes..**.** Oth
2f860 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57  erwise, return W
2f870 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69  RC_Prune. In thi
2f880 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65  s case, also che
2f890 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  ck if the .** su
2f8a0 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  b-expression mat
2f8b0 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69  ches the criteri
2f8c0 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65  a for being move
2f8d0 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  d to the WHERE.*
2f8e0 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c  * clause. If so,
2f8f0 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57   add it to the W
2f900 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
2f910 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d  replace the sub-
2f920 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69  expression.** wi
2f930 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20  thin the HAVING 
2f940 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2f950 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a  a constant "1"..
2f960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f970 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2f980 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
2f990 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2f9a0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2f9b0 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  !=TK_AND ){.    
2f9c0 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61  Select *pS = pWa
2f9d0 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b  lker->u.pSelect;
2f9e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2f9f0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
2fa00 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d  GroupBy(pWalker-
2fa10 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  >pParse, pExpr, 
2fa20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b  pS->pGroupBy) ){
2fa30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2fa40 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  db = pWalker->pP
2fa50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
2fa60 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
2fa70 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
2fa80 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
2fa90 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
2faa0 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
2fab0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2fac0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
2fad0 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20   pS->pWhere;.   
2fae0 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20       SWAP(Expr, 
2faf0 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a  *pNew, *pExpr);.
2fb00 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2fb10 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2fb20 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  , pWhere, pNew);
2fb30 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68  .        pS->pWh
2fb40 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ere = pNew;.    
2fb50 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2fb60 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  de = 1;.      }.
2fb70 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2fb80 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
2fb90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2fba0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2fbb0 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c  Transfer eligibl
2fbc0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
2fbd0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
2fbe0 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68  f a query, which
2fbf0 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64   is.** processed
2fc00 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c   after grouping,
2fc10 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2fc20 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70  ause, which is p
2fc30 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a  rocessed before.
2fc40 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72  ** grouping. For
2fc50 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
2fc60 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
2fc70 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2fc80 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52  es> WHERE a=? GR
2fc90 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2fca0 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a  b=? AND c=?.**.*
2fcb0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2fcc0 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  en as:.**.**   S
2fcd0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2fce0 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2fcf0 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59  AND b=? GROUP BY
2fd00 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a   b HAVING c=?.**
2fd10 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68  .** A term of th
2fd20 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2fd30 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20  ion is eligible 
2fd40 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20  for transfer if 
2fd50 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65  it consists.** e
2fd60 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
2fd70 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73  ants and express
2fd80 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c  ions that are al
2fd90 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  so GROUP BY term
2fda0 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68  s that.** use th
2fdb0 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61  e "BINARY" colla
2fdc0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
2fdd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  /.static void ha
2fde0 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73  vingToWhere(Pars
2fdf0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2fe00 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  t *p){.  Walker 
2fe10 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65  sWalker;.  memse
2fe20 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
2fe30 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b  izeof(sWalker));
2fe40 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
2fe50 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
2fe60 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2fe70 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68  ack = havingToWh
2fe80 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  ereExprCb;.  sWa
2fe90 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d  lker.u.pSelect =
2fea0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   p;.  sqlite3Wal
2feb0 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20  kExpr(&sWalker, 
2fec0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66  p->pHaving);.#if
2fed0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2fee0 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b  BLED.  if( sWalk
2fef0 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c  er.eCode && (sql
2ff00 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2ff10 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
2ff20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2ff30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2ff40 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d  Move HAVING term
2ff50 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22  s into WHERE:\n"
2ff60 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2ff70 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2ff80 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2ff90 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
2ffa0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2ffb0 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70  pThis entry of p
2ffc0 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c  TabList is a sel
2ffd0 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f  f-join of a prio
2ffe0 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74  r view..** If it
2fff0 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e   is, then return
30000 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
30010 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20  m for the prior 
30020 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20  view.  If it is 
30030 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  not,.** then ret
30040 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
30050 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30060 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e  item *isSelfJoin
30070 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20  View(.  SrcList 
30080 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
30090 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
300a0 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e  or self-joins in
300b0 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73   this FROM claus
300c0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
300d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69  cList_item *pThi
300e0 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  s   /* Search fo
300f0 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63  r prior referenc
30100 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65  e to this subque
30110 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ry */.){.  struc
30120 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30130 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74  pItem;.  for(pIt
30140 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
30150 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70  ; pItem<pThis; p
30160 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
30170 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d   pItem->pSelect=
30180 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30190 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
301a0 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20  .viaCoroutine ) 
301b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
301c0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
301d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
301e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
301f0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61  ricmp(pItem->zDa
30200 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a  tabase, pThis->z
30210 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63  Database)!=0 ) c
30220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30230 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
30240 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
30250 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  This->zName)!=0 
30260 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30270 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
30280 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20  ompare(0, .     
30290 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c       pThis->pSel
302a0 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  ect->pWhere, pIt
302b0 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68  em->pSelect->pWh
302c0 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b  ere, -1) .    ){
302d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69  .      /* The vi
302e0 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20  ew was modified 
302f0 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  by some other op
30300 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20  timization such 
30310 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68  as.      ** push
30320 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29  DownWhereTerms()
30330 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
30340 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ue;.    }.    re
30350 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a  turn pItem;.  }.
30360 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
30370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
30380 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
30390 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65  ATION./*.** Atte
303a0 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  mpt to transform
303b0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
303c0 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  form.**.**    SE
303d0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
303e0 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
303f0 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M t1 UNION ALL S
30400 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29  ELECT y FROM t2)
30410 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73  .**.** Into this
30420 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
30430 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  T (SELECT count(
30440 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c  *) FROM t1)+(SEL
30450 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30460 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  M t2).**.** The 
30470 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f  transformation o
30480 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c  nly works if all
30490 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
304a0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
304b0 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75  *   *  The subqu
304c0 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41  ery is a UNION A
304d0 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  LL of two or mor
304e0 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20  e terms.**   *  
304f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
30500 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
30510 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a  IT clause.**   *
30520 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48    There is no WH
30530 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20  ERE or GROUP BY 
30540 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
30550 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72  s on the subquer
30560 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  ies.**   *  The 
30570 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
30580 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29   simple count(*)
30590 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
305a0 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
305b0 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74  zation is undert
305c0 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aken..*/.static 
305d0 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f  int countOfViewO
305e0 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73  ptimization(Pars
305f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
30600 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
30610 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pSub, *pPrior;.
30620 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
30630 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20   Expr *pCount;. 
30640 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
30650 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30660 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
30670 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
30680 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
30690 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
306a0 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
306b0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
306c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
306d0 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c   /* Single resul
306e0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45  t column */.  pE
306f0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
30700 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
30710 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
30720 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
30730 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30740 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e   /* Result is an
30750 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
30760 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
30770 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
30780 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72  ken,"count") ) r
30790 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20  eturn 0;  /* Is 
307a0 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28  count() */.  if(
307b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
307c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
307d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
307e0 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
307f0 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  *) */.  if( p->p
30800 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
30810 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
30830 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20   table in FROM  
30840 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
30850 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
30860 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
30870 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
308a0 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
308b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
308c0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
308d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
308e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
308f0 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79  be a compound ry
30900 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   */.  do{.    if
30910 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41  ( pSub->op!=TK_A
30920 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  LL && pSub->pPri
30930 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
30940 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e  /* Must be UNION
30950 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20   ALL */.    if( 
30960 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72  pSub->pWhere ) r
30970 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30990 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   No WHERE clause
309a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
309b0 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
309c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
309d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
309e0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
309f0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65      if( pSub->se
30a00 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
30a10 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30  egate ) return 0
30a20 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20  ;     /* Not an 
30a30 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20  aggregate */.   
30a40 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50   pSub = pSub->pP
30a50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rior;           
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65     /* Repeat ove
30a80 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  r compound */.  
30a90 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
30aa0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
30ab0 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  h this point the
30ac0 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65  n it is OK to pe
30ad0 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66  rform the transf
30ae0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  ormation */..  d
30af0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
30b00 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72    pCount = pExpr
30b10 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20  ;.  pExpr = 0;. 
30b20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
30b30 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
30b40 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
30b50 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
30b60 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
30b70 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b  te(db, p->pSrc);
30b80 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c  .  p->pSrc = sql
30b90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
30ba0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
30bb0 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a  eof(*p->pSrc));.
30bc0 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b    while( pSub ){
30bd0 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d  .    Expr *pTerm
30be0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
30bf0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sub->pPrior;.   
30c00 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20   pSub->pPrior = 
30c10 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65  0;.    pSub->pNe
30c20 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  xt = 0;.    pSub
30c30 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
30c40 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
30c50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
30c60 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
30c70 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
30c80 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71  tRow = 0;.    sq
30c90 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
30ca0 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  ete(db, pSub->pE
30cb0 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d  List);.    pTerm
30cc0 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69   = pPrior ? sqli
30cd0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
30ce0 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75  Count, 0) : pCou
30cf0 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45  nt;.    pSub->pE
30d00 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
30d10 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
30d20 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a  rse, 0, pTerm);.
30d30 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
30d40 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
30d50 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30   TK_SELECT, 0, 0
30d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
30d70 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
30d80 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62  rse, pTerm, pSub
30d90 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
30da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
30db0 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  pr = pTerm;.    
30dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
30dd0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
30de0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55  r(pParse, TK_PLU
30df0 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29  S, pTerm, pExpr)
30e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
30e10 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20   = pPrior;.  }. 
30e20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
30e30 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
30e40 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
30e50 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
30e60 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30e70 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30e80 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30e90 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30ea0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
30eb0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
30ec0 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65  ter count-of-vie
30ed0 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c  w optimization:\
30ee0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
30ef0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
30f00 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
30f10 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b  ndif.  return 1;
30f20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30f30 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
30f40 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
30f50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
30f60 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
30f70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
30f80 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
30f90 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
30fa0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
30fb0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
30fc0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
30fd0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
30fe0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
30ff0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
31000 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
31010 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
31020 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
31030 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31040 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
31050 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
31060 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
31070 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
31080 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
31090 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
310a0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
310b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
310c0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
310d0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
310e0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
310f0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
31100 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
31110 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
31120 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
31130 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
31140 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
31150 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
31160 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
31170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31180 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31190 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
311a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
311b0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
311c0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
311d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
311e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31200 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
31210 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
31220 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
31230 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
31240 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
31250 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
31260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31270 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
31280 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
31290 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
312a0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
312b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
312c0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
312d0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
312e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
312f0 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
31300 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
31310 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
31320 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
31330 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
31340 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
31350 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
31360 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
31370 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
31380 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
31390 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
313a0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
313b0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
313c0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
313d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
313e0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
313f0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
31400 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
31410 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
31420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
31430 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
31440 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
31450 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
31460 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
31470 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
31480 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
31490 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
314a0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
314b0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
314c0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
314d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
314e0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
314f0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
31500 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
31510 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
31520 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
31530 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
31540 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
31550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
31560 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
31570 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
31580 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
31590 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
315a0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
315b0 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f  xOrderBy = 0;  /
315c0 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59  * Added ORDER BY
315d0 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
315e0 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e  ries */.  u8 min
315f0 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20  MaxFlag;        
31600 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
31610 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
31620 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  ries */..  db = 
31630 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
31640 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
31650 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
31660 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
31670 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
31680 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
31690 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
316a0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
316b0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
316c0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
316d0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
316e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
316f0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
31700 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
31710 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31720 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
31730 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
31740 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
31750 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  \n", pParse->add
31760 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66  rExplain));.  if
31770 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
31780 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
31790 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
317a0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
317b0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
317c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
317d0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
317e0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
317f0 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
31800 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
31810 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
31820 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
31830 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
31840 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
31850 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
31860 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
31870 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
31880 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
31890 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
318a0 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
318b0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
318c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
318d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
318e0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
318f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
31900 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
31910 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31920 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
31930 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
31940 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
31950 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
31960 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
31970 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31980 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
31990 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
319a0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
319b0 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
319c0 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
319d0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
319e0 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
319f0 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
31a00 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
31a10 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
31a20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
31a30 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
31a40 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
31a50 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31a60 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
31a70 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
31a80 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
31a90 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
31aa0 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
31ab0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
31ac0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
31ad0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
31ae0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
31af0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
31b00 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
31b10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
31b20 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20  EList!=0 );.#if 
31b30 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31b40 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
31b50 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31b60 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45  x104 ){.    SELE
31b70 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50  CTTRACE(0x104,pP
31b80 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20  arse,p, ("after 
31b90 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a  name resolution:
31ba0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
31bb0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31bc0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
31bd0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65  endif..  if( pDe
31be0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
31bf0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
31c00 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
31c10 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
31c20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
31c30 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
31c40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69  .  if( sqlite3Wi
31c50 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72  ndowRewrite(pPar
31c60 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
31c70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31c80 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41   }.#if SELECTTRA
31c90 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
31ca0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31cb0 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20  ace & 0x108 ){. 
31cc0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31cd0 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28  x104,pParse,p, (
31ce0 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65  "after window re
31cf0 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  write:\n"));.   
31d00 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31d10 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
31d20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
31d30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31d40 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
31d50 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
31d60 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20  pSrc;.  isAgg = 
31d70 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
31d80 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
31d90 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
31da0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
31db0 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
31dc0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
31dd0 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
31de0 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  o various optimi
31df0 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e  zations (flatten
31e00 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20  ing subqueries, 
31e10 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a  and strength.  *
31e20 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a  * reduction of j
31e30 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69  oin operators) i
31e40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
31e50 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
31e60 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
31e70 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
31e80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
31e90 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
31ea0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
31eb0 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
31ec0 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
31ed0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
31ee0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
31ef0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
31f00 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
31f10 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
31f20 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
31f30 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ect;.    Table *
31f40 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
31f50 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  ab;..    /* Conv
31f60 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e  ert LEFT JOIN in
31f70 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65  to JOIN if there
31f80 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68   are terms of th
31f90 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
31fa0 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54    ** of the LEFT
31fb0 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68   JOIN used in th
31fc0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
31fd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
31fe0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
31ff0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
32000 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
32010 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
32020 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c  llRow(p->pWhere,
32030 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
32040 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
32050 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
32060 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79   SQLITE_Simplify
32070 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Join).    ){.   
32080 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
32090 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20  x100,pParse,p,. 
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
320b0 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c  "LEFT-JOIN simpl
320c0 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e  ifies to JOIN on
320d0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b   term %d\n",i));
320e0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
320f0 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a  .jointype &= ~(J
32100 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29  T_LEFT|JT_OUTER)
32110 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69  ;.      unsetJoi
32120 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  nExpr(p->pWhere,
32130 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
32140 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
32150 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e  No futher action
32160 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66   if this term of
32170 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32180 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72   is no a subquer
32190 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  y */.    if( pSu
321a0 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
321b0 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
321c0 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
321d0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
321e0 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
321f0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
32200 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
32210 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
32220 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
32230 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
32240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
32250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
32260 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
32270 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
32280 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
32290 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
322c0 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
322d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
322e0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
322f0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
32300 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20    /* Do not try 
32310 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67  to flatten an ag
32320 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
32330 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32340 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67  Flattening an ag
32350 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
32360 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
32370 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
32380 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e  uery.    ** is n
32390 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  ot a join.  But 
323a0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
323b0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
323c0 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
323d0 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  ery.    ** will 
323e0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  be implemented a
323f0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61  s a co-routine a
32400 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  nd there is no a
32410 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20  dvantage to.    
32420 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ** flattening in
32430 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
32440 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62  */.    if( (pSub
32450 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
32460 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20  Aggregate)!=0 ) 
32470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
32480 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f  sert( pSub->pGro
32490 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  upBy==0 );..    
324a0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  /* If the outer 
324b0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
324c0 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c   "complex" resul
324d0 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a  t set (that is,.
324e0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65      ** if the re
324f0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
32500 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73  outer query uses
32510 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75   functions or su
32520 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a  bqueries).    **
32530 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71   and if the subq
32540 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  uery contains an
32550 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32560 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69   and if.    ** i
32570 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d  t will be implem
32580 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
32590 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e  utine, then do n
325a0 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69  ot flatten.  Thi
325b0 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63  s.    ** restric
325c0 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20  tion allows SQL 
325d0 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20  constructs like 
325e0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
325f0 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65   **  SELECT expe
32600 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78  nsive_function(x
32610 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d  ).    **    FROM
32620 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
32630 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c  tab ORDER BY y L
32640 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a  IMIT 10);.    **
32650 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65  .    ** The expe
32660 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
32670 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65   is only compute
32680 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73  d on the 10 rows
32690 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65   that.    ** are
326a0 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20   output, rather 
326b0 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f  than every row o
326c0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
326d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
326e0 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
326f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
32700 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72  have a complex r
32710 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a  esult set.    **
32720 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74   means that flat
32730 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75  tening does occu
32740 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c  r on simpler SQL
32750 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74   constraints wit
32760 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  hout.    ** the 
32770 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69  expensive_functi
32780 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a  on() like:.    *
32790 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
327a0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
327b0 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52  x FROM tab ORDER
327c0 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b   BY y LIMIT 10);
327d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
327e0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d  pSub->pOrderBy!=
327f0 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20  0.     && i==0. 
32800 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c      && (p->selFl
32810 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78  ags & SF_Complex
32820 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20  Result)!=0.     
32830 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
32840 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  rc==1.         |
32850 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
32860 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
32870 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
32880 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
32890 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
328a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74   }..    if( flat
328b0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
328c0 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29  se, p, i, isAgg)
328d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
328e0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
328f0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
32900 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
32910 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
32920 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
32930 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
32940 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
32950 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
32960 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21  t_end;.    if( !
32970 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
32980 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
32990 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
329a0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
329b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
329c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
329d0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
329e0 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
329f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
32a00 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
32a10 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
32a20 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
32a30 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
32a40 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
32a50 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
32a60 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
32a70 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66  , p, pDest);.#if
32a80 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32a90 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
32aa0 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c  RACE(0x1,pParse,
32ab0 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
32ac0 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
32ad0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28  ng\n"));.    if(
32ae0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
32af0 72 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d  race & 0x2000)!=
32b00 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72  0 && ExplainQuer
32b10 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72  yPlanParent(pPar
32b20 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  se)==0 ){.      
32b30 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32b40 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32b50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32b60 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
32b70 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50   ) ExplainQueryP
32b80 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
32b90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32ba0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32bb0 44 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61  Do the WHERE-cla
32bc0 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  use constant pro
32bd0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
32be0 61 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73  ation if this is
32bf0 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e  .  ** a join.  N
32c00 6f 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20  o need to speed 
32c10 74 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65  time on this ope
32c20 72 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a  ration for non-j
32c30 6f 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  oin queries.  **
32c40 20 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   as the equivale
32c50 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  nt optimization 
32c60 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20  will be handled 
32c70 62 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  by query planner
32c80 20 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   in.  ** sqlite3
32c90 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
32ca0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
32cb0 74 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20  t->nSrc>1.   && 
32cc0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32cd0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50  led(db, SQLITE_P
32ce0 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20  ropagateConst). 
32cf0 20 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f    && propagateCo
32d00 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
32d10 70 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  p).  ){.#if SELE
32d20 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32d30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
32d40 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
32d50 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
32d60 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
32d70 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63  arse,p,("After c
32d80 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
32d90 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  ion:\n"));.     
32da0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32db0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
32dc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43  }else{.    SELEC
32de0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
32df0 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74  rse,p,("Constant
32e00 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74   propagation not
32e10 20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20   helpful\n"));. 
32e20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
32e30 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
32e40 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
32e50 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
32e60 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
32e70 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
32e80 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
32e90 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
32ea0 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
32eb0 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
32ec0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
32ed0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
32ee0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32ef0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
32f00 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
32f10 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
32f20 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
32f30 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
32f40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
32f50 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
32f60 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
32f70 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
32f80 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
32f90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
32fa0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
32fb0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
32fc0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
32fd0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
32fe0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32ff0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
33000 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
33010 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
33020 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
33030 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
33040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
33050 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
33060 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
33070 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
33080 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
33090 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
330a0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
330b0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
330c0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
330d0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
330e0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
330f0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
33100 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
33110 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
33120 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
33130 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
33140 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
33150 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
33160 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
33170 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
33180 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
33190 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
331a0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
331b0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
331c0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
331d0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
331e0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
331f0 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
33200 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
33210 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
33220 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
33230 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
33240 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
33250 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
33260 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
33270 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
33280 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
33290 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
332a0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
332b0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
332c0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
332d0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
332e0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
332f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
33300 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
33310 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
33320 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
33330 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33340 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
33350 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
33360 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
33370 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
33380 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
33390 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
333a0 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
333b0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
333c0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
333d0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
333e0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
333f0 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
33400 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33410 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
33420 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
33430 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
33440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33450 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
33460 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
33470 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
33480 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
33490 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
334a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
334b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
334c0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
334d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
334e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
334f0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
33500 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
33510 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
33520 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
33530 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
33540 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
33550 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
33560 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
33570 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
33580 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
33590 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
335a0 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
335b0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
335c0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
335d0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
335e0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
335f0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
33600 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
33610 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
33620 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
33630 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
33640 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
33650 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
33660 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
33670 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
33680 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
33690 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
336a0 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
336b0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
336c0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
336d0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
336e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
336f0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
33700 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
33710 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
33720 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33730 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
33740 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
33750 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
33760 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
33770 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
33780 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
33790 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
337a0 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
337b0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
337c0 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
337d0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
337e0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
337f0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
33800 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
33810 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33820 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
33830 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
33840 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33850 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
33860 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
33870 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33880 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
33890 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
338a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
338b0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
338c0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
338d0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
338e0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
338f0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
33900 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
33910 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
33920 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
33930 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
33940 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
33950 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
33960 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
33970 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
33980 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
33990 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
339a0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
339b0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
339c0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
339d0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
339e0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
339f0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
33a00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
33a10 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
33a20 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
33a30 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
33a40 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
33a50 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
33a60 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
33a70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
33a80 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
33a90 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
33aa0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
33ab0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
33ac0 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
33ad0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
33ae0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
33af0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
33b00 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20  LITE_PushDown). 
33b10 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
33b20 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
33b30 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
33b40 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
33b50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
33b70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
33b80 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
33b90 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
33ba0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
33bb0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
33bc0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
33bd0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
33be0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
33bf0 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  00,pParse,p,.   
33c00 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65 72           ("After
33c10 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
33c20 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62  sh-down into sub
33c30 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53  query %d:\n", pS
33c40 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  ub->selId));.   
33c50 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
33c60 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
33c70 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
33c80 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
33c90 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
33ca0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
33cb0 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20  ("Push-down not 
33cc0 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20  possible\n"));. 
33cd0 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64     }..    zSaved
33ce0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
33cf0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
33d00 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  xt;.    pParse->
33d10 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
33d20 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20  Item->zName;..  
33d30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
33d40 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
33d50 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
33d60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
33d70 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65  ubquery is imple
33d80 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
33d90 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75  outine if the su
33da0 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a  bquery is.    **
33db0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
33dc0 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  e the outer loop
33dd0 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65   (so that it doe
33de0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
33df0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
33e00 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29   more than once)
33e10 2e 20 28 31 29 0a 20 20 20 20 2a 2a 0a 20 20 20  . (1).    **.   
33e20 20 2a 2a 20 41 76 6f 69 64 20 75 73 69 6e 67 20   ** Avoid using 
33e30 61 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 74 6f  a co-routines to
33e40 20 63 6f 6d 70 75 74 65 20 61 6e 79 20 53 45 4c   compute any SEL
33e50 45 43 54 20 74 68 61 74 20 6f 63 63 75 72 73 20  ECT that occurs 
33e60 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48  in.    ** the RH
33e70 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
33e80 74 6f 72 2c 20 61 73 20 74 68 65 79 20 63 61 6e  tor, as they can
33e90 20 62 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c   be used multipl
33ea0 65 20 74 69 6d 65 73 2e 20 28 32 29 0a 20 20 20  e times. (2).   
33eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30   */.    if( i==0
33ec0 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
33ed0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
33ee0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62          || (pTab
33ef0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f  List->a[1].fg.jo
33f00 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c  intype&(JT_LEFT|
33f10 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20  JT_CROSS))!=0)  
33f20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26  /* (1) */.     &
33f30 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
33f40 20 53 46 5f 52 68 73 4f 66 49 4e 29 3d 3d 30 20   SF_RhsOfIN)==0 
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f70 20 28 32 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (2) */.    ){. 
33f80 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
33f90 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
33fa0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
33fb0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
33fc0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
33fd0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
33fe0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
33ff0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
34000 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
34010 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
34020 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20  v)+1;.     .    
34030 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
34040 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
34050 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
34060 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
34070 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
34080 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34090 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
340a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
340b0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
340c0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
340d0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
340e0 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
340f0 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
34100 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
34110 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
34120 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
34130 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
34140 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
34150 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
34160 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22 2c 20  CO-ROUTINE %u", 
34170 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSub->selId));. 
34180 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
34190 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
341a0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
341b0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
341c0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
341d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
341e0 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
341f0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
34200 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
34210 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
34220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34230 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
34240 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  v, pItem->regRet
34250 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
34260 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
34270 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
34280 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
34290 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
342a0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
342b0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
342c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
342d0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
342e0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
342f0 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
34300 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
34310 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
34320 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34330 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
34340 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
34350 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
34360 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
34370 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
34380 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
34390 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
343a0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
343b0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
343c0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
343d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
343e0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
343f0 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
34400 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
34410 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  r;.      struct 
34420 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50  SrcList_item *pP
34430 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73  rior;..      ass
34440 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
34450 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
34460 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
34470 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
34480 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
34490 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
344a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
344b0 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
344c0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
344d0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
344e0 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
344f0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
34500 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
34510 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
34520 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
34530 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
34540 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
34550 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
34560 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
34570 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
34580 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
34590 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
345a0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
345b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
345c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
345d0 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  eAddr = sqlite3V
345e0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
345f0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
34600 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
34610 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34620 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
34630 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
34640 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34660 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
34670 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
34680 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
34690 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
346a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
346b0 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f  Prior = isSelfJo
346c0 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c  inView(pTabList,
346d0 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69   pItem);.      i
346e0 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  f( pPrior ){.   
346f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
34710 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75  nDup, pItem->iCu
34720 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43  rsor, pPrior->iC
34730 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
34740 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
34750 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
34760 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c        pSub->nSel
34770 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
34780 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63  >pSelect->nSelec
34790 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tRow;.      }els
347a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
347b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
347c0 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
347d0 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
347e0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45  rsor);.        E
347f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
34800 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54  (pParse, 1, "MAT
34810 45 52 49 41 4c 49 5a 45 20 25 75 22 2c 20 70 53  ERIALIZE %u", pS
34820 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  ub->selId));.   
34830 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
34840 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
34850 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   &dest);.      }
34860 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
34870 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
34880 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
34890 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
348a0 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
348b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
348c0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
348d0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
348e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
348f0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
34900 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
34910 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34920 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
34930 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
34940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34950 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
34960 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
34970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34980 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
34990 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
349a0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
349b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
349c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
349d0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
349e0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
349f0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
34a00 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
34a10 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
34a20 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
34a30 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  ndif.  }..  /* V
34a40 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
34a50 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
34a60 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
34a70 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
34a80 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
34a90 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
34aa0 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
34ab0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
34ac0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
34ad0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
34ae0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
34af0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
34b00 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
34b10 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
34b20 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
34b30 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
34b40 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
34b50 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
34b60 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
34b70 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
34b80 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
34b90 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
34ba0 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
34bb0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
34bc0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
34bd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
34be0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
34bf0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
34c00 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
34c10 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
34c20 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
34c30 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
34c40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
34c50 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
34c60 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
34c70 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
34c80 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
34c90 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
34ca0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
34cb0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
34cc0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
34cd0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
34ce0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
34cf0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
34d00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
34d10 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
34d20 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
34d30 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
34d40 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
34d50 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
34d60 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
34d70 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
34d80 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
34d90 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
34da0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
34db0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
34dc0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
34dd0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
34de0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
34df0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
34e00 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
34e10 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
34e20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
34e30 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
34e40 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
34e50 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
34e60 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
34e70 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
34e80 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
34e90 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
34ea0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
34eb0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
34ec0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
34ed0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
34ee0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
34ef0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
34f00 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
34f10 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
34f20 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
34f30 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
34f40 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
34f50 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
34f60 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
34f70 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
34f80 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
34f90 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
34fa0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
34fb0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
34fc0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
34fd0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
34fe0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
34ff0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
35000 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
35010 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
35020 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
35030 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
35040 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
35050 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
35060 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
35070 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
35080 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
35090 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
350a0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
350b0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
350c0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
350d0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
350e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
350f0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
35100 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
35110 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
35120 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
35130 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
35140 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
35150 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
35160 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
35170 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
35180 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
35190 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
351a0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
351b0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
351c0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
351d0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
351e0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
351f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
35200 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
35210 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
35220 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
35230 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
35240 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
35250 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
35260 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
35270 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
35280 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
35290 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
352a0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
352b0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
352c0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
352d0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
352e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
352f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
35300 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
35310 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
35320 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
35330 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 73 53        pParse, sS
35340 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
35350 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
35360 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
35370 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
35380 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
35390 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
353a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
353b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
353c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
353d0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
353e0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
353f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
35400 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
35410 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
35420 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
35430 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
35440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
35450 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35460 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
35470 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
35480 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
35490 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
354a0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
354b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
354c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
354d0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
354e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
354f0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
35500 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
35510 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
35520 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
35530 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
35540 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
35550 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
35560 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
35570 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
35580 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
35590 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
355a0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
355b0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
355c0 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
355d0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
355e0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
355f0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
35600 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
35610 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
35620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35630 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
35640 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35650 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
35660 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
35670 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
35680 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
35690 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
356a0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
356b0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
356c0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
356d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
356e0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
356f0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
35700 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
35710 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
35720 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
35730 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
35740 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
35750 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35770 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
35780 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
35790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357a0 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
357b0 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
357c0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
357d0 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357f0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
35800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
35810 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
35820 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
35830 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35840 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
35850 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
35860 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
35870 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
35880 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
35890 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
358a0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
358b0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
358c0 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
358d0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
358e0 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
358f0 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
35900 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
35910 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
35920 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35930 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20  INCT : 0).      
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 28               | (
35950 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
35960 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69  _FixedLimit);.#i
35970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35980 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
35990 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20   Window *pWin = 
359a0 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a  p->pWin;      /*
359b0 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f   Master window o
359c0 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20  bject (or NULL) 
359d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  */.    if( pWin 
359e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
359f0 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70  WindowCodeInit(p
35a00 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20  Parse, pWin);.  
35a10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
35a20 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53 45  ssert( WHERE_USE
35a30 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64  _LIMIT==SF_Fixed
35a40 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f  Limit );...    /
35a50 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
35a60 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
35a70 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
35a80 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65  pParse,p,("Where
35a90 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20  Begin\n"));.    
35aa0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
35ab0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
35ac0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
35ad0 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  ere, sSort.pOrde
35ae0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
35af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b00 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77      p->pEList, w
35b10 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53  ctrlFlags, p->nS
35b20 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69  electRow);.    i
35b30 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
35b40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
35b50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35b60 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
35b70 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
35b80 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
35b90 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
35ba0 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
35bb0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
35bc0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
35bd0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
35be0 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
35bf0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
35c00 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
35c10 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35c20 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
35c30 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
35c40 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
35c50 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
35c60 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53  erBy ){.      sS
35c70 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c  ort.nOBSat = sql
35c80 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
35c90 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ed(pWInfo);.    
35ca0 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c    sSort.labelOBL
35cb0 6f 70 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  opt = sqlite3Whe
35cc0 72 65 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70  reOrderByLimitOp
35cd0 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a  tLabel(pWInfo);.
35ce0 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e        if( sSort.
35cf0 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f  nOBSat==sSort.pO
35d00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
35d10 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
35d20 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35d30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35d40 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
35d50 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
35d60 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
35d70 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35d80 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
35d90 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
35da0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
35db0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
35dc0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35dd0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
35de0 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
35df0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64      if( sSort.ad
35e00 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
35e10 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  & sSort.pOrderBy
35e20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
35e30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
35e40 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
35e50 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
35e60 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
35e70 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69   p->pEList==pELi
35e80 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  st );.#ifndef SQ
35e90 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
35ea0 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69  FUNC.    if( pWi
35eb0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
35ec0 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74  ddrGosub = sqlit
35ed0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
35ee0 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  v);.      int iC
35ef0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
35f00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
35f10 20 20 20 20 20 69 6e 74 20 69 42 72 65 61 6b 20       int iBreak 
35f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35f30 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35f40 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
35f50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
35f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
35f70 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61  ndowCodeStep(pPa
35f80 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
35f90 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
35fa0 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  sub);..      sql
35fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
35fc0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
35fd0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
35fe0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35ff0 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75  abel(v, addrGosu
36000 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  b);.      VdbeNo
36010 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  opComment((v, "i
36020 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75  nner-loop subrou
36030 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73  tine"));.      s
36040 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74  Sort.labelOBLopt
36050 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 6c 65   = 0;.      sele
36060 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
36070 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
36080 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
36090 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  Dest, iCont, iBr
360a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
360b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
360c0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
360d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
360e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
360f0 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a  urn, regGosub);.
36100 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36110 74 28 28 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72  t((v, "end inner
36120 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65  -loop subroutine
36130 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
36140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
36150 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
36160 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
36170 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
36180 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
36190 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20   {.      /* Use 
361a0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
361b0 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
361c0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
361d0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
361e0 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
361f0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
36200 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36210 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
36220 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
36230 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
36240 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
36250 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
36260 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
36270 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20  can loop..      
36280 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36290 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
362a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
362b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
362c0 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
362d0 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
362e0 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
362f0 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
36300 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
36310 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
36320 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
36330 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
36340 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
36350 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
36360 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
36370 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
36380 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
36390 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
363a0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
363b0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
363c0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
363d0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
363e0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
363f0 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
36400 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
36410 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
36420 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
36430 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
36440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36450 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
36460 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
36470 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
36480 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
36490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364a0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
364b0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
364c0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
364d0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
364e0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
364f0 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
36500 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
36510 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
36520 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
36530 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
36540 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
36550 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
36560 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
36570 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
36580 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
36590 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
365a0 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
365b0 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
365c0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
365d0 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
365e0 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
365f0 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
36600 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
36610 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
36620 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
36630 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
36640 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
36650 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
36660 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
36670 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
36680 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
36690 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
366a0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
366b0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
366c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
366d0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36700 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
36710 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
36720 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
36730 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
36740 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
36750 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
36760 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
36770 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
36780 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
36790 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
367a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
367b0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
367c0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
367d0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
367e0 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
367f0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
36800 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
36810 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
36820 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
36830 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d       assert( 66=
36840 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36850 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  00) );.      if(
36860 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36   p->nSelectRow>6
36870 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  6 ) p->nSelectRo
36880 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73  w = 66;.    }els
36890 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
368a0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
368b0 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d  t(1) );.      p-
368c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
368d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
368e0 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
368f0 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
36900 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
36910 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
36920 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c     ** identical,
36930 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
36940 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61  possible to disa
36950 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
36960 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20   clause .    ** 
36970 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74  on the grounds t
36980 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
36990 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
369a0 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
369b0 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
369c0 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49  correct order. I
369d0 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d  t also may not -
369e0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69   the GROUP BY mi
369f0 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  ght use a.    **
36a00 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
36a10 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
36a20 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
36a30 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
36a40 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
36a50 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
36a60 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
36a70 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
36a80 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
36a90 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
36aa0 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
36ab0 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
36ac0 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
36ad0 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
36ae0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
36af0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
36b00 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
36b10 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
36b20 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
36b30 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
36b40 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
36b50 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
36b60 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
36b70 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
36b80 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
36b90 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
36ba0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
36bb0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
36bc0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
36bd0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
36be0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
36bf0 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
36c00 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
36c10 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
36c20 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
36c30 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
36c40 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
36c50 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
36c60 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
36c70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
36c80 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
36c90 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
36ca0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
36cb0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
36cc0 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20  .uNC.pAggInfo = 
36cd0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56  &sAggInfo;.    V
36ce0 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46  VA_ONLY( sNC.ncF
36cf0 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e  lags = NC_UAggIn
36d00 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67 49 6e  fo; ).    sAggIn
36d10 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
36d20 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
36d30 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
36d40 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
36d50 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
36d60 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
36d70 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
36d80 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
36d90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
36da0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
36db0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
36dc0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
36dd0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
36de0 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
36df0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
36e00 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
36e10 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  By ){.        as
36e20 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d  sert( pWhere==p-
36e30 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20  >pWhere );.     
36e40 20 20 20 61 73 73 65 72 74 28 20 70 48 61 76 69     assert( pHavi
36e50 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29  ng==p->pHaving )
36e60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36e70 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70  ( pGroupBy==p->p
36e80 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 20  GroupBy );.     
36e90 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65     havingToWhere
36ea0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
36eb0 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d       pWhere = p-
36ec0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d  >pWhere;.      }
36ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
36ee0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
36ef0 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
36f00 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
36f10 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
36f20 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
36f30 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
36f40 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 26  p->pGroupBy==0 &
36f50 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  & p->pHaving==0 
36f60 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e  && sAggInfo.nFun
36f70 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 69  c==1 ){.      mi
36f80 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61  nMaxFlag = minMa
36f90 78 51 75 65 72 79 28 64 62 2c 20 73 41 67 67 49  xQuery(db, sAggI
36fa0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  nfo.aFunc[0].pEx
36fb0 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65  pr, &pMinMaxOrde
36fc0 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rBy);.    }else{
36fd0 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61  .      minMaxFla
36fe0 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
36ff0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  Y_NORMAL;.    }.
37000 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
37010 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
37020 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
37030 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
37040 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
37050 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
37060 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
37070 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
37080 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
37090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
370a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
370b0 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
370c0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
370d0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
370e0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
370f0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
37100 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
37110 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
37120 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
37130 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
37140 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
37150 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  d;.#if SELECTTRA
37160 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
37170 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
37180 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
37190 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
371a0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
371b0 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
371c0 28 22 41 66 74 65 72 20 61 67 67 72 65 67 61 74  ("After aggregat
371d0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
371e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
371f0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
37200 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   p, 0);.      fo
37210 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
37220 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  nfo.nColumn; ii+
37230 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
37240 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37250 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69  agg-column[%d] i
37260 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
37270 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
37280 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65  nfo.aCol[ii].iMe
37290 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
372a0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
372b0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  0, sAggInfo.aCol
372c0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  [ii].pExpr, 0);.
372d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
372e0 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
372f0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29  nfo.nFunc; ii++)
37300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37310 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67  3DebugPrintf("ag
37320 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d  g-func[%d]: iMem
37330 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
37340 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
37350 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29  .aFunc[ii].iMem)
37360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37370 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
37380 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
37390 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  ii].pExpr, 0);. 
373a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
373b0 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  dif...    /* Pro
373c0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
373d0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
373e0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
373f0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
37400 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
37410 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
37420 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
37430 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
37440 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
37450 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
37460 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
37470 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
37480 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
37490 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
374a0 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
374b0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
374c0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
374d0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
374e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
374f0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
37500 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
37510 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
37520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
37530 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
37540 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
37550 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
37560 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
37570 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
37580 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
37590 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
375a0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
375b0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
375c0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
375d0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
375e0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
375f0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
37600 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
37610 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
37620 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
37630 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
37640 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
37650 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
37660 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
37670 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
37680 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
37690 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
376a0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
376b0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
376c0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
376d0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
376e0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
376f0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
37700 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
37710 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
37720 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
37730 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
37740 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
37750 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
37760 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
37770 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
37780 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
37790 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
377a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
377b0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
377c0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
377d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
377e0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
377f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
37800 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
37810 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
37820 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
37830 61 72 73 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c  arse,pGroupBy,0,
37840 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
37850 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
37860 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
37870 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
37880 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
37890 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
378a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
378b0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
378c0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
378d0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
378e0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
378f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
37900 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
37910 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
37920 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
37930 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
37940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
37950 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
37960 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
37970 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
37980 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37990 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
379a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
379b0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
379c0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
379d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
379e0 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
379f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37a00 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
37a10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
37a20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
37a30 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
37a40 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
37a50 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
37a60 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
37a70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
37a80 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
37a90 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
37aa0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
37ab0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
37ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37ad0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
37ae0 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
37af0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
37b00 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
37b10 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
37b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37b30 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
37b40 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d   0, iAMem, iAMem
37b50 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  +pGroupBy->nExpr
37b60 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  -1);..      /* B
37b70 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
37b80 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
37b90 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
37ba0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
37bb0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
37bc0 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
37bd0 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
37be0 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
37bf0 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
37c00 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
37c10 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
37c20 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
37c30 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
37c40 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
37c50 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
37c60 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
37c70 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
37c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
37ca0 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
37cb0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
37cc0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
37cd0 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42  Parse,p,("WhereB
37ce0 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  egin\n"));.     
37cf0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
37d00 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
37d10 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
37d20 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
37d30 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  0,.          WHE
37d40 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72  RE_GROUPBY | (or
37d50 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45  derByGrp ? WHERE
37d60 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30  _SORTBYGROUP : 0
37d70 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
37d80 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
37d90 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
37da0 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73  end;.      if( s
37db0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
37dc0 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47  ered(pWInfo)==pG
37dd0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b  roupBy->nExpr ){
37de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
37df0 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
37e00 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
37e10 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
37e20 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
37e30 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
37e40 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
37e50 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
37e60 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
37e70 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
37e80 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
37e90 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
37ea0 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
37eb0 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
37ec0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
37ed0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
37ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
37ef0 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
37f00 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
37f10 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
37f20 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
37f30 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
37f40 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
37f50 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
37f60 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
37f70 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
37f80 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
37f90 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
37fa0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
37fb0 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
37fc0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
37fd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37fe0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
37ff0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
38000 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
38010 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
38020 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
38030 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
38040 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
38050 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
38060 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
38070 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
38080 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30  &SF_Distinct)==0
38090 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
380a0 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43          "DISTINC
380b0 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29  T" : "GROUP BY")
380c0 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
380d0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
380e0 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
380f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
38100 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
38110 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
38120 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
38130 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
38140 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
38150 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
38160 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
38170 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
38180 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
38190 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
381a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
381b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
381c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
381d0 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
381e0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
381f0 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
38200 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
38210 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
38220 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
38230 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
38240 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
38250 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
38260 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
38270 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
38280 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
38290 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
382a0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
382b0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
382c0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
382d0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
382e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
382f0 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
38300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
38310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
38320 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
38330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38350 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
38360 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e  ->iTable, pCol->
38370 69 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  iColumn, r1);.  
38380 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
38390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
383a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
383b0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
383c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
383d0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
383e0 74 65 33 56 64 6