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

Artifact 18636c49eeb9016bb429ac6892220aea51bc618d021cf16770146e1858cf6f1e:


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: 75 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20  u8 sortFlags;   
0a60: 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
0a70: 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a   more SORTFLAG_*
0a80: 20 62 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f   bits */.  u8 bO
0a90: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b  rderedInnerLoop;
0aa0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72   /* ORDER BY cor
0ab0: 72 65 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65  rectly sorts the
0ac0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 23   inner loop */.#
0ad0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0ae0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
0af0: 45 4e 43 45 53 0a 20 20 75 38 20 6e 44 65 66 65  ENCES.  u8 nDefe
0b00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
0b10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
0b20: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 44 65 66   entries in aDef
0b30: 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74  er[] */.  struct
0b40: 20 44 65 66 65 72 72 65 64 43 73 72 20 7b 0a 20   DeferredCsr {. 
0b50: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
0b60: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0b70: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
0b80: 20 20 69 6e 74 20 69 43 73 72 3b 20 20 20 20 20    int iCsr;     
0b90: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
0ba0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
0bb0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
0bd0: 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75  umber of PK colu
0be0: 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65 20 70 54  mns for table pT
0bf0: 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20 20 7d 20  ab (>=1) */.  } 
0c00: 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65 6e 64 69  aDefer[4];.#endi
0c10: 66 0a 20 20 73 74 72 75 63 74 20 52 6f 77 4c 6f  f.  struct RowLo
0c20: 61 64 49 6e 66 6f 20 2a 70 44 65 66 65 72 72 65  adInfo *pDeferre
0c30: 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a 20 44 65  dRowLoad;  /* De
0c40: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
0c50: 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55 4c 4c 20  ng info or NULL 
0c60: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f  */.};.#define SO
0c70: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
0c80: 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20    0x01   /* Use 
0c90: 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65  SorterOpen inste
0ca0: 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65  ad of OpenEpheme
0cb0: 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ral */../*.** De
0cc0: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lete all the con
0cd0: 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74  tent of a Select
0ce0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61   structure.  Dea
0cf0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75  llocate the stru
0d00: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
0d10: 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73  only if bFree is
0d20: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0d30: 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63   void clearSelec
0d40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  t(sqlite3 *db, S
0d50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46  elect *p, int bF
0d60: 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ree){.  while( p
0d70: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
0d80: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
0d90: 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  or;.    sqlite3E
0da0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0db0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
0dc0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0de0: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc);.    sqlite3
0df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0e00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0e20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f  lete(db, p->pGro
0e30: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0e40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0e50: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e70: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
0e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ea0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
0eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ec0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
0ed0: 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57     if( OK_IF_ALW
0ee0: 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69 6e  AYS_TRUE(p->pWin
0ef0: 44 65 66 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  Defn) ){.      s
0f00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
0f10: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
0f20: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 7d 0a 23  inDefn);.    }.#
0f30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 4f 4b  endif.    if( OK
0f40: 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
0f50: 70 2d 3e 70 57 69 74 68 29 20 29 20 73 71 6c 69  p->pWith) ) sqli
0f60: 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 64 62  te3WithDelete(db
0f70: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20  , p->pWith);.   
0f80: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0f90: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fa0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fb0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fc0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0fe0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0ff0: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1000: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1010: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1020: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1030: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1040: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1050: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1060: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1070: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1080: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
1090: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10a0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10c0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10d0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
10f0: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1100: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1110: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1120: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1130: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1140: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1150: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1160: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1170: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1180: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
1190: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11c0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11d0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11e0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
11f0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1200: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1210: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1220: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1230: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1240: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1250: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1260: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1270: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1280: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
1290: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12a0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12b0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12c0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12d0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12e0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
12f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1300: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1310: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1320: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1330: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1340: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1350: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1360: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1370: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1380: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1390: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13c0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13d0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
13f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1400: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1410: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1440: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1450: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1460: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1470: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1480: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1490: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14a0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14c0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14d0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14e0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
14f0: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1500: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1510: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1520: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1530: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1540: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1550: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1560: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1570: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1580: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
1590: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15a0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15b0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15c0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15d0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15e0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
15f0: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1600: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1610: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1620: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1630: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1640: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1650: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1660: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
1690: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16a0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16c0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16e0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
16f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1700: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1710: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1730: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1740: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1750: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1760: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1770: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1780: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
1790: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17a0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17b0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17c0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17e0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
17f0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1800: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1810: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1820: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1830: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1840: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1850: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1860: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1870: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1880: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
1890: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18a0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18b0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18c0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18d0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
18f0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1900: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1910: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1920: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1930: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1940: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1950: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1960: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1970: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1980: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1990: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19a0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19b0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19c0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19e0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
19f0: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a00: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a10: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a20: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a30: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a40: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a50: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a70: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a80: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1a90: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1aa0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ab0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ac0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ad0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1af0: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b00: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b10: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b20: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b30: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b60: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b80: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1b90: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1ba0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bb0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bc0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1bd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1be0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c00: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c10: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c20: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c30: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c40: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c50: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c60: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c70: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c80: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1c90: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1ca0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cb0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1cd0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1ce0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1cf0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d00: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d10: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d20: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d40: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d50: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d60: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d80: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1d90: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1da0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1db0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dc0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1dd0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1de0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1df0: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e00: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e10: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e20: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e30: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e40: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e50: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e60: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e70: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1e90: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1ea0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1eb0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ec0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ed0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ee0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1ef0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f00: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f10: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f20: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f40: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f50: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f80: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1f90: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fa0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fb0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fc0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fd0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1fe0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1ff0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2010: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2020: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2030: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2040: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2050: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2060: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2070: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
2090: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20a0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20b0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20c0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20e0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
20f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2100: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2110: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2120: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2130: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2140: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2150: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2160: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2170: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2180: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
2190: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21c0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21d0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21e0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
21f0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2200: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2210: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2220: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2240: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2250: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2260: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2270: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2280: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
2290: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2300: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2310: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2320: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2330: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2350: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2360: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2370: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2380: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
2390: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23a0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23b0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23c0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23d0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23e0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
23f0: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2400: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2410: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2430: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2440: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2450: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2460: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2470: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2480: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
2490: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24a0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24b0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24c0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24e0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
24f0: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2500: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2510: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2520: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2530: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2540: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2550: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2560: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2570: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2580: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
2590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25a0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25b0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25c0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25f0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2600: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2610: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2640: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2650: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2660: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2670: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2680: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
2690: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26a0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26c0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26d0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26f0: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2700: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2710: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2720: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2730: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2740: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2760: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2770: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2780: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
2790: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27a0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27b0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27d0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27e0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
27f0: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2800: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2810: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2820: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2830: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2840: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2850: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2860: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2870: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2880: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
2890: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28a0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28b0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28c0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28d0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28e0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
28f0: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2900: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2920: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2940: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2960: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2970: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2980: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29b0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29c0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29d0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a00: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a20: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a40: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a50: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a60: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a80: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2a90: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2aa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ab0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ad0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2ae0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2af0: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b10: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b20: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b30: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b50: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b60: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b70: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b80: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2b90: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2ba0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bb0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bc0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2bd0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2be0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2bf0: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c10: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c20: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c30: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c40: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c50: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c60: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c70: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c80: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2c90: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2ca0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cb0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cc0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2cd0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2ce0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2cf0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d00: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d10: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d20: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d30: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d40: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d50: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d60: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d70: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d80: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2d90: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2da0: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2db0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2dc0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2dd0: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2de0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2df0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2e00: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2e10: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2e20: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
2e30: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
2e40: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
2e50: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
2e60: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
2e70: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
2e80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2e90: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2ea0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2eb0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2ec0: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2ed0: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2ee0: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2ef0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2f00: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2f10: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2f20: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2f30: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2f40: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2f50: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2f60: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2f70: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2f80: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2f90: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2fa0: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2fb0: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2fc0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2fd0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2ff0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
3000: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
3010: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
3020: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
3030: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
3040: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
3050: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
3060: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
3070: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
3080: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3090: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
30a0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
30b0: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
30c0: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
30d0: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
30f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
3100: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
3110: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
3120: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
3130: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
3140: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
3150: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
3160: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
3170: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
3180: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
3190: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
31a0: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
31b0: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
31c0: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
31d0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
31e0: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
31f0: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
3200: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
3210: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
3220: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
3230: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
3240: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
3250: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
3260: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3280: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
3290: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
32a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
32b0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
32c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
32d0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
32e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
32f0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
3300: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
3310: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
3320: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
3330: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
3340: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
3350: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
3360: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
3370: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d  K_FUNCTION && p-
3380: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
33a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70  or(i=0; i<p->x.p
33b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
33c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f  ){.        setJo
33d0: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
33e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
33f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
3400: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69      }.    setJoi
3410: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
3420: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
3430: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
3440: 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68 65 20  .}../* Undo the 
3450: 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69 6e 45  work of setJoinE
3460: 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65 20 65  xpr().  In the e
3470: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70  xpression tree p
3480: 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72 79 0a  , convert every.
3490: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
34a0: 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
34b0: 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52 69 67  romJoin and iRig
34c0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
34d0: 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ble into.** an o
34e0: 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74 68 61  rdinary term tha
34f0: 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50 5f 46  t omits the EP_F
3500: 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a 2a 2a  romJoin mark..**
3510: 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73  .** This happens
3520: 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a 4f 49   when a LEFT JOI
3530: 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65 64 20  N is simplified 
3540: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
3550: 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JOIN..*/.static
3560: 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69 6e 45   void unsetJoinE
3570: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
3580: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
3590: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
35a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
35b0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  p, EP_FromJoin).
35c0: 20 20 20 20 20 26 26 20 28 69 54 61 62 6c 65 3c       && (iTable<
35d0: 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74 4a 6f  0 || p->iRightJo
35e0: 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 29  inTable==iTable)
35f0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 43 6c   ){.      ExprCl
3600: 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
3610: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3620: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
3630: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
3640: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
3650: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3670: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
3680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  i++){.        un
3690: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
36a0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
36b0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
36c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
36d0: 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e  nsetJoinExpr(p->
36e0: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
36f0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3700: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  t;.  } .}../*.**
3710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
3720: 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e  ocesses the join
3730: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3740: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3750: 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55  ent..** ON and U
3760: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
3770: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
3780: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74  extra terms of t
3790: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
37a0: 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  .** NATURAL join
37b0: 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78  s also create ex
37c0: 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
37d0: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   terms..**.** Th
37e0: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f  e terms of a FRO
37f0: 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e  M clause are con
3800: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65  tained in the Se
3810: 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74  lect.pSrc struct
3820: 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ure..** The left
3830: 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74   most table is t
3840: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
3850: 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20  n Select.pSrc.  
3860: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a  The right-most.*
3870: 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c  * table is the l
3880: 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ast entry.  The 
3890: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  join operator is
38a0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74   held in the ent
38b0: 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66  ry to.** the lef
38c0: 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30  t.  Thus entry 0
38d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f   contains the jo
38e0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  in operator for 
38f0: 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e  the join between
3900: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e  .** entries 0 an
3910: 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20  d 1.  Any ON or 
3920: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73  USING clauses as
3930: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3940: 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c  e join are.** al
3950: 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  so attached to t
3960: 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a  he left entry..*
3970: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3980: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
3990: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
39a0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
39b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
39c0: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
39d0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
39e0: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
39f0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
3a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
3a10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3a20: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
3a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
3a60: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3a70: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b  ist_item *pLeft;
3a80: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62       /* Left tab
3a90: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
3aa0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3ab0: 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74  ist_item *pRight
3ac0: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61  ;    /* Right ta
3ad0: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
3ae0: 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d   */..  pSrc = p-
3af0: 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d  >pSrc;.  pLeft =
3b00: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20   &pSrc->a[0];.  
3b10: 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b  pRight = &pLeft[
3b20: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
3b30: 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  <pSrc->nSrc-1; i
3b40: 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c  ++, pRight++, pL
3b50: 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  eft++){.    Tabl
3b60: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3b70: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3b80: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3b90: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3ba0: 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70  ft->pTab==0 || p
3bb0: 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63  RightTab==0) ) c
3bc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f  ontinue;.    isO
3bd0: 75 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e  uter = (pRight->
3be0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3bf0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3c00: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3c10: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3c20: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3c30: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3c40: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3c50: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3c60: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3c70: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3c80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3c90: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
3ca0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
3cb0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3cc0: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
3cd0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3ce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3cf0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
3d00: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
3d10: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
3d20: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
3d30: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
3d40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3d50: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3d60: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
3d70: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
3d80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3d90: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
3da0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
3db0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
3dc0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3dd0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
3de0: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
3df0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e00: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
3e10: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
3e20: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
3e30: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e40: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
3e50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
3e60: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
3e70: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3e80: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3e90: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3ea0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
3eb0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3ec0: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ed0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3ee0: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
3ef0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3f00: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3f20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3f30: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
3f40: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3f50: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
3f60: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
3f70: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
3f80: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
3f90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3fa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3fb0: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3fc0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3fd0: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3fe0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3ff0: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
4000: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
4010: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
4020: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
4030: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
4040: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
4050: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
4060: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
4070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
4080: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
4090: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
40a0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
40b0: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
40c0: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
40d0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
40e0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
40f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
4100: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4110: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4120: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4130: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4140: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4150: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4160: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4170: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4180: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
4190: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41a0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41b0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41c0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41d0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41e0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
41f0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4200: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4210: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4220: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4230: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4240: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4250: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4260: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4270: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4280: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
4290: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42a0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42b0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42d0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42e0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
42f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4300: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4310: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4320: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4330: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4340: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4350: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4360: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4370: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4380: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
4390: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43a0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43c0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43d0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43e0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
43f0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4400: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4410: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4420: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4430: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4440: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4450: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4460: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4470: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4480: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
4490: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44b0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44c0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44e0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
44f0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4500: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4510: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4520: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4530: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4540: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4550: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4560: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4570: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4580: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
4590: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45b0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45c0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45d0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45e0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4600: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4640: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4650: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4660: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4670: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4680: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
4690: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46a0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46b0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46c0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46e0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
46f0: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4700: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4710: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4730: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4740: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4750: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4760: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4770: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4780: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
4790: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47b0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47c0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47d0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
47f0: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4800: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4810: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4820: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4830: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4840: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4850: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4860: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4870: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4880: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
4890: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48a0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48b0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48c0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48d0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
48f0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4900: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4920: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4930: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4940: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4950: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4960: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4970: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4980: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
4990: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49a0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49b0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49d0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49e0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
49f0: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a00: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a30: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a60: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a70: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a80: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4a90: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4aa0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ab0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ad0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4ae0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4af0: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b00: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b10: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b20: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b30: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b40: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b50: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b60: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b80: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4b90: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4ba0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bb0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bc0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4bd0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4be0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4bf0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c00: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c10: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c20: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c30: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c50: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c60: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c70: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c80: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4c90: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4ca0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cb0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cc0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4cd0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4ce0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cf0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d00: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d10: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d20: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d30: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d50: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d60: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d70: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d80: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4d90: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4da0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4db0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dc0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4dd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4de0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4df0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e00: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e10: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e20: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e40: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e50: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e70: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e80: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4e90: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4ea0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4eb0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ec0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ed0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ee0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4ef0: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f00: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f10: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f30: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f40: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f50: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f60: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f70: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f80: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4f90: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fa0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4fe0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4ff0: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5000: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5010: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5020: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5030: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5040: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5050: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5060: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5070: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5080: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
5090: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50c0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50d0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
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 20 20 20 20 20 20 20 20 20                  
5100: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5110: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5120: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5130: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5160: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5170: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5180: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51b0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51c0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
51f0: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5200: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5210: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5240: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5250: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5280: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
5290: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52a0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52c0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52d0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52e0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
52f0: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5300: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5310: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5320: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5330: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5340: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5350: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5360: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5370: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5380: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
5390: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53a0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53b0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53c0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53d0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53e0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
53f0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5400: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5410: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5420: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5430: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5440: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5460: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5470: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5480: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
5490: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54a0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54b0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54c0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54d0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54e0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
54f0: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5500: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5510: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5520: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5530: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5540: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5550: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5560: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5570: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5580: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
5590: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55a0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55b0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55c0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55d0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55e0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
55f0: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5600: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5610: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5620: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5630: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5650: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5660: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5670: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5680: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
5690: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56a0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56c0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56d0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56e0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
56f0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5710: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
5720: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
5730: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
5740: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
5750: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
5760: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5770: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
5780: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
5790: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
57a0: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
57b0: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
57c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
57d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
57e0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
57f0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
5800: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
5810: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
5820: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
5830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5840: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5850: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
5860: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
5870: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42  );.  }.  if( nOB
5880: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
5890: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
58a0: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
58b0: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
58c0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
58d0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
58e0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
58f0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
5900: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
5910: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
5920: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5930: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
5940: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
5950: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
5960: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
5970: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
5980: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
5990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
59a0: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
59b0: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
59c0: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
59d0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
59e0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
59f0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
5a00: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
5a10: 2f 0a 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64  /..    regRecord
5a20: 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63   = makeSorterRec
5a30: 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ord(pParse, pSor
5a40: 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42  t, pSelect, regB
5a50: 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20  ase, nBase);.   
5a60: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
5a70: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
5a80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5a90: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
5aa0: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
5ab0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
5ac0: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
5ad0: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
5ae0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
5af0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5b00: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
5b10: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
5b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
5b30: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
5b40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5b50: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
5b60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5b70: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
5b80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ba0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
5bb0: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
5bc0: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
5bd0: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
5be0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5bf0: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
5c00: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
5c10: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
5c20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
5c30: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
5c40: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
5c50: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
5c60: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
5c70: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
5c80: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
5c90: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
5ca0: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
5cb0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
5cc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5cd0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
5ce0: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
5cf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
5d00: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
5d10: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
5d20: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
5d30: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c  4.pKeyInfo = sql
5d40: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
5d50: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
5d60: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e  Sort->pOrderBy,n
5d70: 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20  OBSat,.         
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64    pKI->nAllField
5db0: 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d  -pKI->nKeyField-
5dc0: 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20  1);.    addrJmp 
5dd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5de0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
5df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e00: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
5e10: 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64  ddrJmp+1, 0, add
5e20: 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rJmp+1); VdbeCov
5e30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53  erage(v);.    pS
5e40: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
5e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5e60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70  eLabel(v);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  Or, if the.    *
62e0: 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65  * pSort->bOrdere
62f0: 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61 67 20  dInnerLoop flag 
6300: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
6310: 74 65 20 74 68 61 74 20 74 68 65 20 69 6e 6e 65  te that the inne
6320: 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 64 65  r.    ** loop de
6330: 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69 6e 20  livers items in 
6340: 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6a 75  sorted order, ju
6350: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
6360: 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
6370: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
6380: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  p..    */.    in
6390: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
63a0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71  iECursor;.    sq
63b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
63c0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
63d0: 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74 65 33   iLimit, sqlite3
63e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
63f0: 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+4);.    VdbeC
6400: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6420: 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43  2(v, OP_Last, iC
6430: 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53 6b 69  sr, 0);.    iSki
6440: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6450: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
6460: 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  dxLE,.          
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 20 20 69 43 73 72 2c 20 30 2c 20         iCsr, 0, 
6490: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
64a0: 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20  nExpr-nOBSat);. 
64b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
64c0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
64d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
64e0: 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20  Delete, iCsr);. 
64f0: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65 63 6f   }.  if( regReco
6500: 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 67  rd==0 ){.    reg
6510: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
6520: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
6530: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
6540: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
6550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
6560: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
6570: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
6580: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
6590: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
65a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
65b0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
65c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
65d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
65e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
65f0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  r, regRecord,.  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42       regBase+nOB
6620: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
6630: 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69 70 20  t);.  if( iSkip 
6640: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6650: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
6660: 6e 65 72 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70 53  nerLoop==0 || pS
6670: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
6680: 65 72 4c 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20 20  erLoop==1 );.   
6690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
66a0: 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20  geP2(v, iSkip,. 
66b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
66c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
66d0: 29 20 2b 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65  ) + pSort->bOrde
66e0: 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 29 3b 0a 20  redInnerLoop);. 
66f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
6700: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
6710: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
6720: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
6730: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
6740: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
6750: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
6760: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
6770: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
6780: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
6790: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
67a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
67b0: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
67c0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
67d0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
67e0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
67f0: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
6800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6810: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
6820: 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  s, iOffset, iCon
6830: 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43  tinue, 1); VdbeC
6840: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6850: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6860: 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a  "OFFSET"));.  }.
6870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6880: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63  e that will chec
6890: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
68a0: 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73  he N registers s
68b0: 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a  tarting at iMem.
68c0: 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e  ** form a distin
68d0: 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20  ct entry.  iTab 
68e0: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
68f0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
6900: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
6910: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
6920: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
6930: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
6940: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
6950: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
6960: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
6970: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
6980: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
6990: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
69a0: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
69b0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
69c0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
69d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
69e0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
69f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
6a00: 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20  stinct(.  Parse 
6a10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
6a20: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6a30: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6a40: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ext */.  int iTa
6a50: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
6a60: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75   sorting index u
6a70: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
6a80: 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a  distinctness */.
6a90: 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74    int addrRepeat
6aa0: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ,    /* Jump to 
6ab0: 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74  here if not dist
6ac0: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  inct */.  int N,
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ae0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
6af0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d  ts */.  int iMem
6b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6b10: 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  rst element */.)
6b20: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
6b30: 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50  nt r1;..  v = pP
6b40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72  arse->pVdbe;.  r
6b50: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6b60: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b80: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6b90: 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70  d, iTab, addrRep
6ba0: 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56  eat, iMem, N); V
6bb0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bd0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6be0: 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72  cord, iMem, N, r
6bf0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
6c00: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
6c10: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
6c20: 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a  , r1, iMem, N);.
6c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c40: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6c50: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
6c60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6c70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6c80: 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r1);.}..#ifdef S
6c90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
6ca0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f  TER_REFERENCES./
6cb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6cc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
6cd0: 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f  part of inner-lo
6ce0: 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f  op generation fo
6cf0: 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  r a SELECT.** st
6d00: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  atement with an 
6d10: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69 73  ORDER BY that is
6d20: 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20 62   not optimized b
6d30: 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a  y an index. It .
6d40: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
6d50: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 69  e expressions, i
6d60: 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65 20  f any, that the 
6d70: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
6d80: 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f   .** optimizatio
6d90: 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  n should be used
6da0: 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65 72   for. The sorter
6db0: 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d  -reference optim
6dc0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  ization.** is us
6dd0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71 75  ed for SELECT qu
6de0: 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a  eries like:.**.*
6df0: 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69  *   SELECT a, bi
6e00: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
6e10: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
6e20: 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  0.**.** If the o
6e30: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
6e40: 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
6e50: 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74 68  on "bigblob", th
6e60: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  en instead of.**
6e70: 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73 20   storing values 
6e80: 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20 63  read from that c
6e90: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72  olumn in the sor
6ea0: 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68 65  ter records, the
6eb0: 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f   PK of.** the ro
6ec0: 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 20  w from table t1 
6ed0: 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65 61  is stored instea
6ee0: 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63 6f  d. Then, as reco
6ef0: 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74 65  rds are extracte
6f00: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f  d from.** the so
6f10: 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74  rter to return t
6f20: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
6f30: 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 6f  required value o
6f40: 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20  f bigblob is.** 
6f50: 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63 74  retrieved direct
6f60: 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ly from table t1
6f70: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73 20  . If the values 
6f80: 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c 20  are very large, 
6f90: 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20  this .** can be 
6fa0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74  more efficient t
6fb0: 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65 6d  han storing them
6fc0: 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68 65   directly in the
6fd0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e   sorter records.
6fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c  .**.** The ExprL
6ff0: 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72  ist_item.bSorter
7000: 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74 20  Ref flag is set 
7010: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
7020: 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a  ion in pEList .*
7030: 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
7040: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
7050: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
7060: 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64 2e  ould be enabled.
7070: 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c   .** Additionall
7080: 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61 44  y, the pSort->aD
7090: 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20  efer[] array is 
70a0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
70b0: 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c  ntries.** for al
70c0: 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  l cursors requir
70d0: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
70e0: 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70 72  ll selected expr
70f0: 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79  essions. Finally
7100: 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69  ..** output vari
7110: 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29 20  able (*ppExtra) 
7120: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78 70  is set to an exp
7130: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
7140: 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65  taining.** expre
7150: 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65  ssions for all e
7160: 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20 74  xtra PK values t
7170: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 74  hat should be st
7180: 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73  ored in the.** s
7190: 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a  orter records..*
71a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
71b0: 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a 20  lectExprDefer(. 
71c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72   /* Leave any er
71f0: 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f  ror here */.  So
7200: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7220: 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74 20   Sorter context 
7230: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7240: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
7250: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
7260: 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72  ons destined for
7270: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78 70   sorter */.  Exp
7280: 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61 20  rList **ppExtra 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 61  Expressions to a
72b0: 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72 20  ppend to sorter 
72c0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
72d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66  nt i;.  int nDef
72e0: 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  er = 0;.  ExprLi
72f0: 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a  st *pExtra = 0;.
7300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
7310: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7320: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
7330: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7340: 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69  m = &pEList->a[i
7350: 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ];.    if( pItem
7360: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
7370: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  l==0 ){.      Ex
7380: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
7390: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
73a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
73b0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
73c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
73d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
73e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
73f0: 26 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72  & pTab && !IsVir
7400: 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20  tual(pTab).     
7410: 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c    && (pTab->aCol
7420: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
7430: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
7440: 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20  LAG_SORTERREF). 
7450: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7460: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
7470: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72  or(j=0; j<nDefer
7480: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7490: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65    if( pSort->aDe
74a0: 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78  fer[j].iCsr==pEx
74b0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  pr->iTable ) bre
74c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65        if( j==nDe
74e0: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fer ){.         
74f0: 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72   if( nDefer==Arr
7500: 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44  aySize(pSort->aD
7510: 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  efer) ){.       
7520: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7530: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7540: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
7550: 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  nKey = 1;.      
7560: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
7570: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
7580: 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPk = 0;.       
7590: 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
75a0: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
75b0: 20 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20            pPk = 
75c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
75d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79              nKey
75f0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7610: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
7620: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
7630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7640: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
7650: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7660: 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  , TK_COLUMN, 0, 
7670: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7680: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
76a0: 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ew->iTable = pEx
76b0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
76d0: 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
76e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
76f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c        pNew->iCol
7700: 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  umn = pPk ? pPk-
7710: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d  >aiColumn[k] : -
7720: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
7730: 20 20 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69     pExtra = sqli
7740: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7750: 64 28 70 50 61 72 73 65 2c 20 70 45 78 74 72 61  d(pParse, pExtra
7760: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
7770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7790: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
77a0: 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20  [nDefer].pTab = 
77b0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
77c0: 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e           pSort->
77d0: 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69  aDefer[nDefer].i
77e0: 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Csr = pExpr->iTa
77f0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
7800: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
7810: 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b  Defer].nKey = nK
7820: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
7830: 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nDefer++;.      
7840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7850: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62          pItem->b
7860: 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20  SorterRef = 1;. 
7870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7880: 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  .  pSort->nDefer
7890: 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20   = (u8)nDefer;. 
78a0: 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74   *ppExtra = pExt
78b0: 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ra;.}.#endif../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
78e0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
78f0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
7900: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
7910: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
7920: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
7930: 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45  , then the p->pE
7940: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
7950: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
7960: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
7970: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
7980: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
7990: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
79a0: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
79b0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
79c0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70   srcTab and p->p
79d0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
79e0: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
79f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7a00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
7a10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
7a20: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
7a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
7a40: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
7a50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7a70: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
7a80: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7aa0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
7ab0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
7ac0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
7ad0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
7ae0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
7af0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
7b00: 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74  ble if non-negat
7b10: 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ive */.  SortCtx
7b20: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
7b30: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
7b40: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
7b50: 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59  process ORDER BY
7b60: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
7b70: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
7b80: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7b90: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7ba0: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
7bb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
7bc0: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
7bd0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
7be0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
7bf0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
7c10: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
7c20: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
7c30: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c50: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
7c60: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
7c70: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
7c80: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7c90: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
7ca0: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
7cb0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  inct;           
7cc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7cd0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
7ce0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
7cf0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7d00: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
7d10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7d20: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
7d30: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
7d40: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
7d50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
7d60: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
7d70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
7d80: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
7d90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7da0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
7db0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
7dc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
7dd0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
7de0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
7df0: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20  e regResult */. 
7e00: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f   RowLoadInfo sRo
7e10: 77 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20  wLoadInfo;   /* 
7e20: 49 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65  Info for deferre
7e30: 64 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f  d row loading */
7e40: 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20  ..  /* Usually, 
7e50: 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65  regResult is the
7e60: 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61   first cell in a
7e70: 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72  n array of memor
7e80: 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e  y cells.  ** con
7e90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
7ea0: 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20  ent result row. 
7eb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
7ec0: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74  Orig is set to t
7ed0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c  he.  ** same val
7ee0: 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ue. However, if 
7ef0: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
7f00: 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68  being sent to th
7f10: 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20  e sorter, the.  
7f20: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e  ** values for an
7f30: 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  y expressions th
7f40: 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74  at are also part
7f50: 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79   of the sort-key
7f60: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a   are omitted.  *
7f70: 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61  * from this arra
7f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
7f90: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
7fa0: 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e  o zero.  */.  in
7fb0: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
7fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
7fd0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
7fe0: 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73  ding current res
7ff0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ults */.  int re
8000: 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  gOrig;          
8010: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
8020: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
8030: 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72   full result (or
8040: 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   0) */..  assert
8050: 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( v );.  assert(
8060: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
8070: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
8080: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
8090: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
80a0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
80b0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
80c0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
80d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
80e0: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
80f0: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
8100: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
8110: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
8120: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
8130: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
8140: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
8150: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
8160: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8170: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
8180: 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  sultCol = p->pEL
8190: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
81a0: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
81b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
81c0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
81d0: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
81e0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
81f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
8200: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
8210: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
8220: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
8230: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
8240: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
8250: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
8260: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
8270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
8280: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8290: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
82a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
82b0: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
82c0: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
82d0: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
82e0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
82f0: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
8300: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
8310: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
8320: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
8330: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
8340: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
8350: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
8360: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
8370: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
8380: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
8390: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
83a0: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
83b0: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
83c0: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
83d0: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
83e0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
83f0: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
8400: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
8410: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
8420: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
8430: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
8440: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
8450: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
8460: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
8470: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
8480: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72  sultCol;.  regOr
8490: 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d  ig = regResult =
84a0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
84b0: 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29   if( srcTab>=0 )
84c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
84d0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
84e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
8510: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
8520: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
8530: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d  ent((v, "%s", p-
8540: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  >pEList->a[i].zN
8550: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
8560: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
8570: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69  SRT_Exists ){.#i
8580: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8590: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
85a0: 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73  NCES.    ExprLis
85b0: 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23  t *pExtra = 0;.#
85c0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
85d0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
85e0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
85f0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
8600: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
8610: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
8620: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
8630: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
8640: 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63      */.    u8 ec
8650: 65 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22  elFlags;    /* "
8660: 65 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72  ecel" is an abbr
8670: 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70  eviation of "Exp
8680: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a  rCodeExprList" *
8690: 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
86a0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
86b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
86c0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
86d0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
86e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
86f0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
8700: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
8710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8720: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30     ecelFlags = 0
8730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8740: 70 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74  pSort && hasDist
8750: 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74  inct==0 && eDest
8760: 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26  !=SRT_EphemTab &
8770: 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  & eDest!=SRT_Tab
8780: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  le ){.      /* F
8790: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
87a0: 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20  on in p->pEList 
87b0: 74 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f  that is a copy o
87c0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
87d0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  in.      ** the 
87e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
87f0: 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  (pSort->pOrderBy
8800: 29 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63  ), set the assoc
8810: 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  iated .      ** 
8820: 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
8830: 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  e to one more th
8840: 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  an the index of 
8850: 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20  the ORDER BY .  
8860: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
8870: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72  n within the sor
8880: 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f  t-key that pushO
8890: 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c  ntoSorter() will
88a0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20   generate..     
88b0: 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20   ** This allows 
88c0: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69  the p->pEList fi
88d0: 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65  eld to be omitte
88e0: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
88f0: 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  d record,.      
8900: 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20  ** saving space 
8910: 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20  and CPU cycles. 
8920: 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   */.      ecelFl
8930: 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45  ags |= (SQLITE_E
8940: 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49  CEL_OMITREF|SQLI
8950: 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20  TE_ECEL_REF);.. 
8960: 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74       for(i=pSort
8970: 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72  ->nOBSat; i<pSor
8980: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
8990: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
89a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
89b0: 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d   if( (j = pSort-
89c0: 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  >pOrderBy->a[i].
89d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
89e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
89f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31  p->pEList->a[j-1
8a00: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8a10: 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e  l = i+1-pSort->n
8a20: 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d  OBSat;.        }
8a30: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
8a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8a60: 20 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72        selectExpr
8a70: 44 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53  Defer(pParse, pS
8a80: 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  ort, p->pEList, 
8a90: 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  &pExtra);.      
8aa0: 69 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50  if( pExtra && pP
8ab0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8ac0: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
8ad0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
8ae0: 20 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50   are any extra P
8af0: 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64  K columns to add
8b00: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72   to the sorter r
8b10: 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20  ecords,.        
8b20: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72  ** allocate extr
8b30: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  a memory cells a
8b40: 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70  nd adjust the Op
8b50: 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
8b60: 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
8b70: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
8b80: 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65  or the larger re
8b90: 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f  cords. This is o
8ba0: 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  nly.        ** r
8bb0: 65 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65  equired if there
8bc0: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
8bd0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
8be0: 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20  ables with.     
8bf0: 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20     ** composite 
8c00: 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20  primary keys in 
8c10: 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66  the SortCtx.aDef
8c20: 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a  er[] array.  */.
8c30: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
8c40: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
8c50: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
8c60: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
8c70: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
8c80: 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78   += (pExtra->nEx
8c90: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66  pr - pSort->nDef
8ca0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  er);.        pOp
8cb0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ->p4.pKeyInfo->n
8cc0: 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78  AllField += (pEx
8cd0: 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  tra->nExpr - pSo
8ce0: 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20  rt->nDefer);.   
8cf0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8d00: 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  m += pExtra->nEx
8d10: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  pr;.      }.#end
8d20: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a  if..      /* Adj
8d30: 75 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74  ust nResultCol t
8d40: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f  o account for co
8d50: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f  lumns that are o
8d60: 6d 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  mitted.      ** 
8d70: 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
8d80: 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  by the optimizat
8d90: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61  ions in this bra
8da0: 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c  nch */.      pEL
8db0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
8dc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8dd0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
8df0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
8e00: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
8e10: 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  0.#ifdef SQLITE_
8e20: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8e30: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20  FERENCES.       
8e40: 20 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69    || pEList->a[i
8e50: 5d 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e  ].bSorterRef.#en
8e60: 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  dif.        ){. 
8e70: 20 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74           nResult
8e80: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Col--;.         
8e90: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
8ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8eb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ec0: 20 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20   regOrig );.    
8ed0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
8ee0: 74 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20  t==SRT_Set );.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8f00: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a  est==SRT_Mem );.
8f10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8f20: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8f30: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
8f40: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8f50: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8f60: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8f70: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
8f80: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
8f90: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
8fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8fb0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
8fc0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
8fd0: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72    sRowLoadInfo.r
8fe0: 65 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65  egResult = regRe
8ff0: 73 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  sult;.    sRowLo
9000: 61 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73  adInfo.ecelFlags
9010: 20 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69   = ecelFlags;.#i
9020: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9030: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
9040: 4e 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61  NCES.    sRowLoa
9050: 64 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70  dInfo.pExtra = p
9060: 45 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c  Extra;.    sRowL
9070: 6f 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61  oadInfo.regExtra
9080: 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75  Result = regResu
9090: 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  lt + nResultCol;
90a0: 0a 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20  .    if( pExtra 
90b0: 29 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20  ) nResultCol += 
90c0: 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23  pExtra->nExpr;.#
90d0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
90e0: 3e 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20  >iLimit.     && 
90f0: 28 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c  (ecelFlags & SQL
9100: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
9110: 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50  )!=0 .     && nP
9120: 72 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29  refixReg>0.    )
9130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9140: 70 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20  pSort!=0 );.    
9150: 20 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73    assert( hasDis
9160: 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
9170: 20 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72    pSort->pDeferr
9180: 65 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f  edRowLoad = &sRo
9190: 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20  wLoadInfo;.     
91a0: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
91b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
91c0: 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28  nnerLoopLoadRow(
91d0: 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77  pParse, p, &sRow
91e0: 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  LoadInfo);.    }
91f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9200: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
9210: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
9220: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
9230: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
9240: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
9250: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
9260: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
9270: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
9280: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
9290: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
92a0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
92b0: 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63  switch( pDistinc
92c0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a  t->eTnctType ){.
92d0: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
92e0: 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
92f0: 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  D: {.        Vdb
9300: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
9310: 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65       /* No longe
9320: 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45  r required OpenE
9330: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20  phemeral instr. 
9340: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9350: 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Jump;           
9360: 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
9370: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nation */.      
9380: 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
93a0: 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e  vious row conten
93b0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
93c0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
93d0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
93e0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
93f0: 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
9400: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9420: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
9430: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
9440: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
9450: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
9460: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
9470: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
9480: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
9490: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
94a0: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
94b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
94c0: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
94d0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
94e0: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
94f0: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
9500: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
9510: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
9520: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
9530: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
9540: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
9550: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
9560: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
9570: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
9580: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
9590: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
95a0: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
95b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
95c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
95d0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
95e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
95f0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
9600: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
9610: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
9620: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
9630: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
9640: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9650: 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   + nResultCol;. 
9660: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
9670: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
9680: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  +){.          Co
9690: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
96a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
96b0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
96c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
96d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
96e0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
96f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9710: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
9720: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
9730: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
9740: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
9750: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
9760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9780: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
9790: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
97a0: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
97b0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
97c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
97e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97f0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
9800: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
9810: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
9820: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
9830: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9840: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
9850: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
9860: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9870: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9880: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
9890: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
98a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
98b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
98c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
98d0: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
98e0: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
98f0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
9900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9910: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
9920: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
9930: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
9940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9950: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
9960: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
9970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9980: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
9990: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
99a0: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
99b0: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
99c0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
99d0: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
99e0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
99f0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
9a00: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
9a10: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
9a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a30: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29        regResult)
9a40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a60: 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20     if( pSort==0 
9a70: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
9a80: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
9a90: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
9aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
9ab0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
9ac0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
9ad0: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
9ae0: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
9af0: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
9b00: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
9b10: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
9b20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9b30: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9b40: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
9b50: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
9b60: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
9b70: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
9b80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ba0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9bb0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9bc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9bd0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
9be0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
9bf0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
9c00: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52   iParm, r1, regR
9c10: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
9c20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
9c30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9c40: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
9c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c60: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
9c70: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
9c80: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
9c90: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
9ca0: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
9cb0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
9cc0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
9cd0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
9ce0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
9cf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
9d00: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
9d10: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
9d20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9d30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9d40: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
9d50: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
9d60: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9d80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9d90: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9da0: 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  LECT */..    /* 
9db0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
9dc0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
9dd0: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
9de0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
9df0: 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  _Fifo:.    case 
9e00: 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20  SRT_DistFifo:.  
9e10: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
9e20: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
9e30: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
9e40: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
9e50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
9e60: 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67  arse, nPrefixReg
9e70: 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  +1);.      testc
9e80: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9e90: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
9ea0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9eb0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
9ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ed0: 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20  eDest==SRT_Fifo 
9ee0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9ef0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  e( eDest==SRT_Di
9f00: 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  stFifo );.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
9f30: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
9f40: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50  ResultCol, r1+nP
9f50: 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64  refixReg);.#ifnd
9f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9f70: 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  TE.      if( eDe
9f80: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
9f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9fa0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
9fb0: 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74  n is DistFifo, t
9fc0: 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72  hen cursor (iPar
9fd0: 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20  m+1) is open.   
9fe0: 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70       ** on an ep
9ff0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49  hemeral index. I
a000: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
a010: 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  w is already pre
a020: 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sent.        ** 
a030: 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f  in the index, do
a040: 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f   not write it to
a050: 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20   the output. If 
a060: 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20  not, add the.   
a070: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
a080: 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78  row to the index
a090: 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
a0a0: 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20  h writing it to 
a0b0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
a0c0: 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77  utput table as w
a0d0: 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
a0e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
a0f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a100: 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20  dr(v) + 4;.     
a110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a120: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
a130: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64  und, iParm+1, ad
a140: 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  dr, r1, 0);.    
a150: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a160: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
a170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a180: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
a190: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72  t, iParm+1, r1,r
a1a0: 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74  egResult,nResult
a1b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Col);.        as
a1c0: 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29  sert( pSort==0 )
a1d0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a1e0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
a1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a200: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72  rt( regResult==r
a210: 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  egOrig );.      
a220: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
a230: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
a240: 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  p, r1+nPrefixReg
a250: 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50  , regOrig, 1, nP
a260: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
a270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a280: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
a290: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a2a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
a2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a2c0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
a2d0: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
a2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a2f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
a300: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
a310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a320: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a330: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
a340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a350: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a360: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
a370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a380: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
a390: 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50  e(pParse, r1, nP
a3a0: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
a3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a3c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
a3e0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
a3f0: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
a400: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
a410: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
a420: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
a430: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
a440: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
a450: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
a460: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
a470: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
a480: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
a490: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
a4a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
a4b0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  et: {.      if( 
a4c0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a4d0: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
a4e0: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
a4f0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
a500: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
a510: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
a520: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
a530: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
a540: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
a550: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
a560: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
a570: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
a580: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
a590: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
a5a0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
a5b0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
a5c0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
a5d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
a5f0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
a600: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
a610: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
a620: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a640: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
a650: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a660: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a670: 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t( sqlite3Strlen
a680: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
a690: 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  st)==nResultCol 
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a6b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a6c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a6d0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a6e0: 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  tCol, .         
a6f0: 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
a700: 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43  ffSdst, nResultC
a710: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a720: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
a730: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
a740: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
a750: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
a760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a770: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
a780: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
a790: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
a7a0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
a7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a7c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a7d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
a7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
a800: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
a810: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
a820: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
a830: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
a840: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
a850: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
a860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a870: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a880: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
a890: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
a8a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
a8b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
a8c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
a8d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
a8e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
a8f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
a900: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
a910: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
a920: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
a930: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
a940: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
a950: 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61  ory cell or arra
a960: 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d  y of .    ** mem
a970: 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72  ory cells and br
a980: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73  eak out of the s
a990: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
a9a0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
a9b0: 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  m: {.      if( p
a9c0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a9d0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
a9e0: 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol<=pDest->nSdst
a9f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68   );.        push
aa00: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
aa10: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
aa20: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
aa30: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
aa40: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
aa50: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
aa60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
aa70: 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d  rt( nResultCol==
aa80: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a  pDest->nSdst );.
aa90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
aaa0: 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d  regResult==iParm
aab0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
aac0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
aad0: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
aae0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
aaf0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
ab00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ab10: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
ab20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ab30: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61  QUERY */..    ca
ab40: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
ab50: 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20  :       /* Send 
ab60: 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75  data to a co-rou
ab70: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  tine */.    case
ab80: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20   SRT_Output: {  
ab90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aba0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
abb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
abd0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
abe0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
abf0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ac00: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
ac10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
ac20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
ac30: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
ac40: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
ac50: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ac70: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
ac80: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
ac90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
aca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
acb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
acc0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
acd0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
ace0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad00: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ad10: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
ad20: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
ad30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ad40: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ad50: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
ad60: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
ad70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ad80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
ad90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ada0: 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72  IT_CTE.    /* Wr
adb0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
adc0: 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20  into a priority 
add0: 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72  queue that is or
ade0: 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
adf0: 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70  .    ** pDest->p
ae00: 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29  OrderBy (in pSO)
ae10: 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  .  pDest->iSDPar
ae20: 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20  m (in iParm) is 
ae30: 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61  the cursor for a
ae40: 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77  n.    ** index w
ae50: 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32  ith pSO->nExpr+2
ae60: 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64   columns.  Build
ae70: 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f   a key using pSO
ae80: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
ae90: 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72     ** pSO->nExpr
aea0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d   columns, then m
aeb0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79  ake sure all key
aec0: 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20  s are unique by 
aed0: 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  adding a.    ** 
aee0: 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63  final OP_Sequenc
aef0: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c  e column.  The l
af00: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  ast column is th
af10: 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c  e record as a bl
af20: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ob..    */.    c
af30: 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75  ase SRT_DistQueu
af40: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
af50: 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69  Queue: {.      i
af60: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69  nt nKey;.      i
af70: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
af80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73       int addrTes
af90: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
afa0: 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20  rList *pSO;.    
afb0: 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70    pSO = pDest->p
afc0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61  OrderBy;.      a
afd0: 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20  ssert( pSO );.  
afe0: 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e      nKey = pSO->
aff0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20  nExpr;.      r1 
b000: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b010: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b020: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
b030: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
b040: 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  se, nKey+2);.   
b050: 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b     r3 = r2+nKey+
b060: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  1;.      if( eDe
b070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b090: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
b0a0: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
b0b0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
b0c0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
b0d0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
b0e0: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
b0f0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
b100: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
b110: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
b120: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
b130: 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20   the queue. */. 
b140: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
b150: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b160: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b170: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
b180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
b1b0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
b1c0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
b1d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b1e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b1f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b200: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
b210: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
b220: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
b230: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
b240: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
b270: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33  ert, iParm+1, r3
b280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b2a0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
b2b0: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d  RESULT);.      }
b2c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b2d0: 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20  i<nKey; i++){.  
b2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
b300: 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b320: 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e  egResult + pSO->
b330: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
b340: 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20  yCol - 1,.      
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20      r2+i);.     
b370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b390: 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d  _Sequence, iParm
b3a0: 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20  , r2+nKey);.    
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b3d0: 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  cord, r2, nKey+2
b3e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
b3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b400: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b410: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
b420: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
b430: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
b440: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b450: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
b460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b470: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b480: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
b490: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b4a0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b4b0: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
b4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b4d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b4e0: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
b4f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b500: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b510: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
b520: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
b530: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
b540: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b550: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
b560: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
b570: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
b580: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
b590: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
b5a0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
b5b0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
b5c0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
b5d0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
b5e0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
b5f0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
b600: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
b610: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
b620: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b630: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
b640: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
b650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b660: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
b670: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
b680: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
b690: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
b6a0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
b6b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
b6c0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
b6d0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
b6e0: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
b6f0: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
b700: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
b710: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
b720: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
b730: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
b740: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b750: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
b760: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
b770: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b780: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
b790: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
b7a0: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
b7b0: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
b7c0: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
b7d0: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
b7e0: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
b7f0: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
b800: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
b810: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
b820: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
b830: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
b840: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
b850: 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) - sizeof(CollS
b860: 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  eq*);.  KeyInfo 
b870: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
b880: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b890: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
b8a0: 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
b8b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74   ){.    p->aSort
b8c0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d  Order = (u8*)&p-
b8d0: 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20  >aColl[N+X];.   
b8e0: 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20   p->nKeyField = 
b8f0: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
b900: 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29  AllField = (u16)
b910: 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e  (N+X);.    p->en
b920: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
b930: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
b940: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
b950: 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20    memset(&p[1], 
b960: 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  0, nExtra);.  }e
b970: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b980: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
b990: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b9a0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
b9b0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
b9c0: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
b9d0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
b9e0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
b9f0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
ba00: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
ba10: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
ba20: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
ba30: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
ba40: 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20  eNN(p->db, p);. 
ba50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
ba60: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
ba70: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
ba80: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
ba90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
baa0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
bab0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
bac0: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
bad0: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
bae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
baf0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bb00: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
bb10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
bb20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
bb30: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
bb40: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
bb50: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
bb60: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
bb70: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
bb80: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
bb90: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
bba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
bbb0: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
bbc0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
bbd0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
bbe0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
bbf0: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
bc00: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
bc10: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
bc20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
bc30: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
bc40: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
bc50: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
bc60: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
bc70: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
bc80: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
bc90: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
bca0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
bcb0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
bcc0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
bcd0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
bce0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
bcf0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
bd00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
bd10: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
bd20: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
bd30: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
bd40: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
bd50: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
bd60: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
bd70: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
bd80: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
bd90: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
bda0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
bdb0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
bdc0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
bdd0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
bde0: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
bdf0: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
be00: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
be10: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
be20: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
be30: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
be40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
be50: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
be60: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
be70: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
be80: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
be90: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bea0: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
beb0: 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  eed..*/.KeyInfo 
bec0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46  *sqlite3KeyInfoF
bed0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
bee0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bef0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
bf00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
bf10: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
bf20: 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79   /* Form the Key
bf30: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Info object from
bf40: 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a   this ExprList *
bf50: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
bf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
bf70: 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75  n with this colu
bf80: 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20  mn of pList */. 
bf90: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
bfa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
bfb0: 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c  s many extra col
bfc0: 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umns to the end 
bfd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  */.){.  int nExp
bfe0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
bff0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
c000: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c010: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
c020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c030: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
c040: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
c050: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
c060: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
c070: 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74  db, nExpr-iStart
c080: 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69  , nExtra+1);.  i
c090: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
c0a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
c0b0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
c0c0: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
c0d0: 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49  for(i=iStart, pI
c0e0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74  tem=pList->a+iSt
c0f0: 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  art; i<nExpr; i+
c100: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
c110: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
c120: 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69  i-iStart] = sqli
c130: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
c140: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
c150: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49  pExpr);.      pI
c160: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
c170: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
c180: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
c190: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c1a0: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
c1b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
c1c0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
c1d0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
c1e0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
c1f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c200: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
c210: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
c220: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
c230: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c240: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
c250: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
c260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
c270: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
c280: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
c290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c2a0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
c2b0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
c2c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
c2d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
c2e0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
c2f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
c300: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
c310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c320: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
c330: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
c340: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
c350: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
c360: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
c370: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
c380: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
c390: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
c3a0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
c3b0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
c3c0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
c3d0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
c3e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
c3f0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
c400: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
c410: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
c420: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
c430: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
c440: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
c450: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
c460: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
c470: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
c480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
c490: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
c4a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
c4b0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
c4c0: 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  {.  ExplainQuery
c4d0: 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
c4e0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
c4f0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
c500: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  e));.}../*.** As
c510: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
c520: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
c530: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
c540: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
c550: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
c560: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
c570: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c580: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
c590: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
c5a0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
c5b0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
c5c0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
c5d0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
c5e0: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
c5f0: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
c600: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c610: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
c620: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
c630: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
c640: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
c650: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
c660: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
c670: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
c680: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
c690: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
c6a0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
c6b0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
c6c0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
c6d0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
c6e0: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
c6f0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
c700: 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  z).#endif.../*.*
c710: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
c720: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
c730: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
c740: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
c750: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
c760: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
c770: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
c780: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
c790: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
c7a0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
c7b0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
c7c0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
c7d0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
c7e0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
c7f0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
c800: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
c810: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
c820: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
c830: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
c840: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
c850: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c860: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
c870: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
c880: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
c890: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
c8a0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
c8b0: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
c8c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
c8d0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
c8e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c8f0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
c900: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
c910: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
c920: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
c930: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
c940: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c950: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c970: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
c980: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
c990: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
c9a0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
c9b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
c9c0: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
c9d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
c9e0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
c9f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ca00: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ca10: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ca20: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75      /* Top of ou
ca50: 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20  tput loop. Jump 
ca60: 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69  for Next. */.  i
ca70: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
ca80: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
ca90: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
caa0: 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  y = pSort->pOrde
cab0: 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74  rBy;.  int eDest
cac0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
cad0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
cae0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20  Dest->iSDParm;. 
caf0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
cb00: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69  nt regRowid;.  i
cb10: 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt iCol;.  int n
cb20: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
cb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cb40: 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
cb50: 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65  mns in sorter re
cb60: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  cord */.  int iS
cb70: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
cb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
cb90: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
cba0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
cbb0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
cbe0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
cbf0: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
cc00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65   */.  int nRefKe
cc10: 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  y = 0;.  struct 
cc20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
cc30: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
cc40: 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  t->a;..  assert(
cc50: 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a   addrBreak<0 );.
cc60: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
cc70: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
cc80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cc90: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
cca0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
ccb0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
ccc0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
ccd0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
cce0: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
ccf0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cd00: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
cd10: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23  elBkOut);.  }..#
cd20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cd30: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
cd40: 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20  ENCES.  /* Open 
cd50: 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64  any cursors need
cd60: 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65  ed for sorter-re
cd70: 66 65 72 65 6e 63 65 20 65 78 70 72 65 73 73 69  ference expressi
cd80: 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ons */.  for(i=0
cd90: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
cda0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62  r; i++){.    Tab
cdb0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74  le *pTab = pSort
cdc0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62  ->aDefer[i].pTab
cdd0: 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  ;.    int iDb = 
cde0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cdf0: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
ce00: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
ce10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
ce20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53  Table(pParse, pS
ce30: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
ce40: 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Csr, iDb, pTab, 
ce50: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ce60: 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28    nRefKey = MAX(
ce70: 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  nRefKey, pSort->
ce80: 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b  aDefer[i].nKey);
ce90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
cea0: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Tab = pSort->iEC
ceb0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
cec0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ced0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
cee0: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
cef0: 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
cf00: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
cf10: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
cf20: 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65  ->iSdst;.  }else
cf30: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
cf40: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
cf50: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
cf60: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
cf70: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
cf80: 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  rse, nColumn);. 
cf90: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
cfa0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
cfb0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
cfc0: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
cfd0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
cfe0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
cff0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
d000: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d010: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
d020: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d030: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
d040: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
d050: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
d060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d070: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
d080: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d090: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
d0a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d0b0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
d0c0: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
d0d0: 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b  , .        nKey+
d0e0: 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65  1+nColumn+nRefKe
d0f0: 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  y);.    if( addr
d100: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
d110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d120: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
d130: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
d140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d150: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
d160: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
d170: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d180: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d190: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1a0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
d1d0: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
d1e0: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
d1f0: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
d200: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
d210: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
d220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d230: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
d240: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
d250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d260: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
d270: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
d280: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
d290: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
d2a0: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
d2b0: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
d2c0: 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e  nKey+bSeq-1; i<n
d2d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69  Column; i++){.#i
d2e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d2f0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
d300: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
d310: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
d320: 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65  f ) continue;.#e
d330: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75  ndif.    if( aOu
d340: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d350: 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c  rByCol==0 ) iCol
d360: 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  ++;.  }.#ifdef S
d370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
d380: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
d390: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66   if( pSort->nDef
d3a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b  er ){.    int iK
d3b0: 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20  ey = iCol+1;.   
d3c0: 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71   int regKey = sq
d3d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
d3e0: 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65  e(pParse, nRefKe
d3f0: 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  y);..    for(i=0
d400: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
d410: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
d420: 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d  nt iCsr = pSort-
d430: 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b  >aDefer[i].iCsr;
d440: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d450: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  ab = pSort->aDef
d460: 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  er[i].pTab;.    
d470: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f    int nKey = pSo
d480: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
d490: 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ey;..      sqlit
d4a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d4b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d4c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  );.      if( Has
d4d0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
d4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d500: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
d510: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29   iKey++, regKey)
d520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d540: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73  P_SeekRowid, iCs
d550: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
d560: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d570: 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67  ntAddr(v)+1, reg
d580: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
d590: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e{.        int k
d5a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  ;.        int iJ
d5b0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
d5c0: 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61  rt( sqlite3Prima
d5d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
d5e0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20  ->nKeyCol==nKey 
d5f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  );.        for(k
d600: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
d610: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d630: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
d640: 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65  tTab, iKey++, re
d650: 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20  gKey+k);.       
d660: 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20   }.        iJmp 
d670: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d680: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6a0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d6b0: 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a  SeekGE, iCsr, iJ
d6c0: 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  mp+2, regKey, nK
d6d0: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
d6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d6f0: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69  t(v, OP_IdxLE, i
d700: 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67  Csr, iJmp+3, reg
d710: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d730: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
d740: 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  Row, iCsr);.    
d750: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d770: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
d780: 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a  gKey, nRefKey);.
d790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
d7a0: 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e  (i=nColumn-1; i>
d7b0: 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66  =0; i--){.#ifdef
d7c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d7d0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
d7e0: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b  .    if( aOutEx[
d7f0: 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  i].bSorterRef ){
d800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d810: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
d820: 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20  OutEx[i].pExpr, 
d830: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d  regRow+i);.    }
d840: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
d850: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 61  {.      int iRea
d860: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75  d;.      if( aOu
d870: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d880: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
d890: 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78    iRead = aOutEx
d8a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
d8b0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c  Col-1;.      }el
d8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61  se{.        iRea
d8d0: 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20  d = iCol--;.    
d8e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d900: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
d910: 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f  ab, iRead, regRo
d920: 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+i);.      Vdbe
d930: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
d940: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
d950: 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  e?aOutEx[i].zNam
d960: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
d970: 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pan));.    }.  }
d980: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
d990: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
d9a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
d9b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
d9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d9e0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
d9f0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da10: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
da20: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
da30: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
da50: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
da60: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
da70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
da80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
da90: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
daa0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
dab0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
dac0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
dad0: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
dae0: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
daf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
db00: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
db10: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
db20: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
db50: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
db60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
db70: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
db80: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
db90: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
dba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dbb0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
dbc0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
dbd0: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
dbe0: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
dbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dc00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
dc10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
dc20: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
dc30: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
dc40: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
dc50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dc60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
dc70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
dc80: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
dc90: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
dca0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dcb0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
dcc0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
dcd0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
dce0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
dcf0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
dd00: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
dd10: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dd20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dd40: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
dd50: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dd60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
dd70: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
dd80: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
dd90: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
dda0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
ddb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ddc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ddd0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
dde0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
ddf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
de00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
de10: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
de20: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
de30: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
de40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
de50: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
de60: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
de90: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
dea0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
deb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
dec0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ded0: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
dee0: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
def0: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
df00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
df10: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
df20: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
df30: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
df40: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
df50: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
df60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df70: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
df80: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
df90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
dfa0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
dfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
dfd0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
dfe0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
dff0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
e000: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
e010: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e020: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
e030: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
e040: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e050: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
e060: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
e070: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
e080: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
e090: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
e0a0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
e0b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
e0c0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
e0d0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
e0e0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
e0f0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
e100: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
e110: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
e120: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
e130: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
e140: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
e150: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
e160: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
e170: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
e180: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
e190: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
e1a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
e1b0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
e1c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
e1d0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
e1e0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e1f0: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
e200: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
e210: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
e220: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
e230: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
e240: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
e250: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
e260: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
e270: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
e280: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
e290: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
e2a0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
e2b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
e2c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e2d0: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
e2e0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
e2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e300: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
e310: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
e320: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
e330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
e340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
e350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
e360: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
e370: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
e380: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
e390: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
e3a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
e3b0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
e3c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
e3d0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
e3e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e3f0: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
e400: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
e410: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
e420: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
e430: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
e440: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
e450: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
e460: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
e470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e480: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e490: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
e4a0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e4b0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e4c0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
e4d0: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
e4e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
e4f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e500: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
e510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e520: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e530: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
e540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e550: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
e560: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
e570: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
e580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e590: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
e5a0: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
e5b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
e5c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
e5d0: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
e5e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
e5f0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e600: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
e610: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
e620: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
e630: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
e640: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e650: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
e660: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e670: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
e680: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
e690: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
e6a0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
e6b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e6c0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e6d0: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
e6e0: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
e6f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e700: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
e710: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
e720: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
e730: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
e770: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
e780: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
e790: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
e7a0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
e7b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e7c0: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
e7d0: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
e7e0: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
e7f0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
e800: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
e810: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
e820: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
e830: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
e840: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
e850: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
e860: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
e870: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
e880: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
e890: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
e8a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
e8b0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
e8c0: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
e8e0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
e8f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
e900: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
e910: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
e920: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
e930: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
e940: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
e950: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
e960: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
e970: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
e980: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
e990: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
e9a0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
e9b0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
e9c0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
e9d0: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
e9e0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
e9f0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
ea00: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
ea10: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
ea20: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
ea30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
ea40: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
ea50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ea60: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
ea70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ea80: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
ea90: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
eaa0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
eab0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
eac0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
ead0: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
eae0: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
eaf0: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
eb00: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
eb10: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
eb20: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
eb30: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
eb40: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
eb50: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
eb60: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
eb70: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
eb80: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
eb90: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
eba0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
ebb0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
ebc0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
ebd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
ebe0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ebf0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
ec00: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
ec10: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
ec20: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
ec30: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
ec40: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
ec50: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
ec60: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
ec70: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
ec80: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
ec90: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
eca0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
ecb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
ecc0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
ecd0: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
ece0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
ecf0: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
ed00: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
ed10: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
ed20: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
ed30: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
ed40: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
ed50: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
ed60: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
ed70: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
ed80: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
ed90: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
eda0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
edb0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
edc0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
edd0: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
ede0: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
edf0: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
ee00: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
ee10: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
ee20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ee30: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
ee40: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
ee50: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
ee60: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
ee70: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ee80: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ee90: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
eea0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
eeb0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
eec0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
eed0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
eee0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
eef0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
ef00: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
ef10: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
ef20: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
ef30: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
ef40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
ef50: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
ef60: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
ef70: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
ef80: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
ef90: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
efa0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
efb0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
efc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
efd0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
efe0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
eff0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
f000: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
f010: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
f020: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
f030: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
f040: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
f050: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f060: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
f070: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
f080: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
f090: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
f0a0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
f0b0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
f0c0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
f0d0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
f0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
f0f0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
f100: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
f110: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
f120: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
f130: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
f140: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f150: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f160: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
f170: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
f180: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
f190: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
f1a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f1b0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f1c0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
f1d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f1e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f200: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
f210: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
f220: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
f230: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f240: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
f250: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
f260: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
f270: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
f280: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
f290: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
f2a0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
f2b0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
f2c0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f2d0: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
f2e0: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
f2f0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
f300: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
f310: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
f320: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
f330: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
f340: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
f350: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
f360: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f370: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
f380: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f390: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
f3a0: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
f3b0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
f3c0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
f3d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
f3e0: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
f3f0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f400: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f410: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f420: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f430: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f440: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f450: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
f460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f470: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
f480: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
f490: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
f4a0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
f4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f4c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
f4d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f4e0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
f4f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
f500: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
f510: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
f520: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
f530: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
f540: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
f550: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
f560: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
f570: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
f580: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f590: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
f5a0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
f5b0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
f5c0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
f5d0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
f5e0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
f5f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
f600: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
f610: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
f620: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f630: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
f640: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
f650: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f660: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
f670: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
f680: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
f690: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
f6a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
f6b0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f6c0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f6d0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f6e0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
f6f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f700: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
f710: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f720: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
f730: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
f740: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
f750: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
f760: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
f770: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
f780: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
f790: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
f7a0: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
f7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
f7c0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
f7d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f7e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
f7f0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
f800: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
f810: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
f820: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f840: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
f850: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
f860: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
f870: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
f880: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
f890: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
f8a0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
f8b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
f8c0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
f8d0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
f8e0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
f8f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f900: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
f910: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f920: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
f930: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
f940: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
f950: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
f960: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
f970: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
f980: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
f990: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
f9a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
f9b0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
f9c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
f9d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
f9e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f9f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
fa00: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
fa10: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
fa20: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fa30: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
fa40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fa50: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
fa60: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
fa70: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
fa80: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
fa90: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
faa0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
fab0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
fac0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
fad0: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
fae0: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
faf0: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
fb00: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
fb10: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
fb20: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
fb30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
fb40: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
fb50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
fb60: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fb70: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fb80: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
fb90: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
fba0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
fbb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fbc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
fbd0: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
fbe0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
fc10: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
fc20: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
fc30: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
fc40: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
fc50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
fc60: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
fc70: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
fc80: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fc90: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
fca0: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
fcb0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fcc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
fcd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fce0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
fcf0: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
fd00: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
fd10: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
fd20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
fd30: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
fd40: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
fd50: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
fd60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
fd70: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
fd80: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
fd90: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
fda0: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
fdb0: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
fdc0: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
fdd0: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
fde0: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
fdf0: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
fe00: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
fe10: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
fe20: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
fe30: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
fe40: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
fe50: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
fe60: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
fe70: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
fe80: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
fe90: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
fea0: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
feb0: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
fed0: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
fee0: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
fef0: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
ff00: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
ff10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
ff20: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
ff30: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
ff40: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
ff50: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
ff60: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
ff70: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
ff80: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
ff90: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
ffa0: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
ffb0: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
ffc0: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
ffd0: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
ffe0: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
fff0: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
10000 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
10010 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
10020 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
10030 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
10040 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
10050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
10060 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
10090 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
100a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
100b0 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
100e0 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
100f0 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
10100 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
10110 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
10120 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
10130 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
10140 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
10150 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
10180 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10190 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
101a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
101d0 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
101e0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
101f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
10220 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
10230 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
10240 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
10250 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
10260 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
10270 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
10280 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
102b0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
102c0 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
102d0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 20          prefix, 
10300 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
10310 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
10320 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
10330 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
10340 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
10350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10360 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
10370 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10380 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
10390 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
103a0 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
103b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
103c0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
103d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
103e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
103f0 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
10400 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
10410 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10420 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10430 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10440 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
10450 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
10460 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
10470 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
10480 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
10490 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
104a0 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
104b0 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
104c0 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
104d0 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
104e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
104f0 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
10500 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
10510 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
10520 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
10530 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
10540 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10550 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
10560 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
10570 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  t ) return;.  /*
10580 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   Column names ar
10590 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
105a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
105b0 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
105c0 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69   select */.  whi
105d0 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
105e0 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
105f0 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
10600 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
10610 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c  ,pParse,pSelect,
10620 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c  ("generating col
10630 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a  umn names\n"));.
10640 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
10650 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
10660 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
10670 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
10680 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
10690 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
106a0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
106b0 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
106c0 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
106d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
106e0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
106f0 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
10700 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10710 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
10720 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
10730 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10740 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
10750 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
10760 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
10770 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10780 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
10790 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
107a0 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
107b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
107c0 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
107d0 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
107e0 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
107f0 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
10800 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
10810 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
10820 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
10830 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
10840 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
10850 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
10860 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
10870 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
10880 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
10890 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
108a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
108b0 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
108c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
108d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
108e0 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
108f0 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
10900 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10920 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
10930 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
10940 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
10950 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10960 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
10970 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
10980 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
10990 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
109a0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
109b0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
109c0 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
109d0 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
109e0 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
109f0 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
10a00 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10a10 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a20 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
10a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10a40 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
10a50 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
10a60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10a70 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
10a80 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
10a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
10aa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
10ab0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
10ac0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
10ad0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10ae0 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10af0 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10b00 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
10b10 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
10b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b40 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b50 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
10b60 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
10b70 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
10b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
10ba0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
10bb0 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
10bc0 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
10bd0 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
10be0 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
10bf0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
10c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c10 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10c20 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10c30 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
10c40 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
10c50 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
10c60 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
10c70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
10c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
10c90 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
10ca0 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
10cb0 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
10cc0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
10cd0 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
10ce0 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
10cf0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
10d00 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
10d10 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
10d20 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
10d30 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
10d40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
10d50 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
10d60 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
10d70 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
10d80 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
10d90 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
10da0 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
10db0 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
10dc0 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
10dd0 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
10de0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
10df0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10e00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
10e10 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
10e20 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
10e30 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
10e40 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
10e50 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
10e60 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
10e70 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
10e80 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
10e90 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
10ea0 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
10eb0 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
10ec0 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
10ed0 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
10ee0 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
10ef0 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
10f00 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
10f10 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
10f20 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
10f30 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
10f40 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
10f50 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
10f60 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
10f70 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
10f80 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
10f90 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
10fa0 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
10fb0 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
10fc0 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
10fd0 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
10fe0 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
10ff0 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
11000 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
11010 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
11020 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
11030 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
11040 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
11050 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
11060 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
11070 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
11080 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11090 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
110a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
110b0 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
110c0 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
110d0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
110e0 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
110f0 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
11120 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
11130 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
11140 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
11150 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
11160 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
11170 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
11180 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11190 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
111a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
111b0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
111c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
111d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
111e0 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11200 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
11210 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
11220 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
11230 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
11240 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11250 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
11260 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
11270 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
11280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11290 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
112a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
112b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
112c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
112d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
112e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
11310 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
11320 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11340 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
11350 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
11360 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
11370 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
11380 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
11390 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
113a0 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
113b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
113c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
113d0 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
113e0 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
113f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
11400 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
11410 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
11420 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
11430 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
11440 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
11450 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
11460 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
11470 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
11480 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
11490 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
114a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
114b0 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
114c0 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
114d0 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
114e0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
114f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
11500 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11510 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
11520 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
11530 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
11540 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
11550 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
11560 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
11570 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
11580 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
11590 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
115a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
115b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
115c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
115d0 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
115e0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
115f0 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
11600 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
11610 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11620 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
11630 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
11640 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  pColExpr->op!=TK
11650 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
11660 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
11670 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
11680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
11690 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
116a0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
116b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
116c0 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
116d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
116e0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
116f0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
11700 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
11710 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11720 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
11730 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
11740 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11750 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11760 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
11770 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
11780 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11790 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
117a0 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
117b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
117c0 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
117d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
117e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
117f0 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
11800 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
11810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11820 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
11830 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
11840 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11850 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11860 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
11870 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
11880 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11890 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
118a0 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
118b0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
118c0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
118d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
118e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
118f0 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
11900 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
11910 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11920 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11930 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
11940 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11950 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11960 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
11970 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
11980 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
11990 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
119a0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
119b0 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
119c0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
119d0 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
119e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
119f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11a00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
11a10 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
11a20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
11a30 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
11a40 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11a50 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11a60 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
11a70 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
11a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
11aa0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
11ab0 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
11ac0 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
11ad0 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
11ae0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
11af0 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
11b00 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
11b10 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
11b20 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
11b30 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
11b40 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11b50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11b60 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11b70 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11b80 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11ba0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
11bc0 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
11bd0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11be0 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
11bf0 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
11c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11c10 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11c20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11c30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11c40 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11c50 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11c60 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11c80 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11cb0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
11cc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
11cd0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
11ce0 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
11cf0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
11d00 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
11d10 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11d20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11d30 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11d40 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11d50 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11d60 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11d70 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11d80 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11d90 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11da0 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11db0 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
11dc0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
11dd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
11de0 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
11df0 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
11e00 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
11e10 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11e20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e30 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11e40 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11e60 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11e70 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11e80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11e90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11ea0 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11eb0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
11ec0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
11ed0 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
11ee0 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
11ef0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
11f00 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
11f10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11f20 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11f30 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
11f40 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
11f50 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
11f60 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
11f70 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
11f80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11f90 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
11fa0 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
11fb0 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
11fc0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
11fd0 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
11fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11ff0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
12000 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
12010 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12020 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
12030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12040 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
12050 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
12060 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
12070 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
12080 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
12090 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
120a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
120b0 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
120c0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
120d0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
120e0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
120f0 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
12100 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
12110 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
12120 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
12130 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12140 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
12150 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
12160 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
12170 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
12180 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
12190 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
121a0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
121b0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
121c0 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
121d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
121e0 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
12210 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
12220 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
12230 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
12240 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
12250 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
12260 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
12270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
12280 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
12290 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
122a0 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
122b0 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
122c0 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
122d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
122e0 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
122f0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
12300 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
12310 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
12320 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
12330 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
12340 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12350 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
12360 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
12370 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
12380 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
12390 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
123a0 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
123b0 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
123c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
123d0 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
123e0 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
123f0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
12400 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
12410 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12420 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
12430 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
12440 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
12450 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12460 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
12470 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
12480 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
12490 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
124a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
124b0 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
124c0 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
124d0 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
124e0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
124f0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
12500 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
12510 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
12520 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
12530 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
12540 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
12550 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
12560 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
12570 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
12580 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
12590 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
125a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
125b0 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
125c0 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
125d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
125e0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
125f0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
12600 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12610 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
12620 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
12630 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
12640 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
12650 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
12660 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
12670 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
12680 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
12690 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
126a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
126b0 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
126c0 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
126d0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
126e0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
126f0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
12700 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
12710 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12720 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
12730 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
12740 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12750 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12760 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12770 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12780 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
12790 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
127a0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
127b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
127c0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
127d0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
127e0 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
127f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
12800 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
12810 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
12820 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
12830 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
12840 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
12850 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
12860 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12870 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
12880 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
12890 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
128a0 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
128b0 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
128c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
128d0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
128e0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
128f0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
12900 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
12910 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
12920 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
12930 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
12940 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
12950 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
12960 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
12970 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
12980 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
12990 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
129a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
129b0 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
129c0 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
129d0 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
129e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
129f0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
12a00 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
12a10 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12a20 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
12a30 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
12a40 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
12a50 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
12a60 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
12a70 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
12a80 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
12a90 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
12aa0 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
12ab0 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
12ac0 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
12ad0 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
12ae0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
12af0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
12b00 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
12b10 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
12b20 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
12b30 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
12b40 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
12b50 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
12b60 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
12b70 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
12b80 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
12b90 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
12ba0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12bb0 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
12bc0 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
12bd0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
12be0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
12bf0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
12c00 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
12c10 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
12c20 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
12c30 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
12c40 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
12c50 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
12c60 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12c70 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
12c80 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
12c90 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
12ca0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12cb0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
12cc0 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
12cd0 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
12ce0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
12cf0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
12d00 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
12d10 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
12d20 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
12d30 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
12d40 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
12d50 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
12d60 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
12d70 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
12d80 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
12d90 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
12da0 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
12db0 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
12dc0 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
12dd0 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
12de0 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
12df0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
12e00 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
12e10 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
12e20 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
12e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12e40 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
12e50 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
12e60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
12e70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
12e80 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
12e90 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
12ea0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
12eb0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
12ec0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
12ed0 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
12ee0 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
12ef0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
12f00 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
12f10 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
12f20 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
12f30 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
12f40 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
12f50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
12f60 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
12f70 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
12f80 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
12f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12fa0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
12fb0 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
12fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12fd0 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
12fe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12ff0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
13000 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
13010 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
13020 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13030 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13040 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13050 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13060 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13070 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
13080 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
13090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
130a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130b0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
130c0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
130d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
130e0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
130f0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
13100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13110 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
13120 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
13130 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
13140 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
13150 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
13170 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
13180 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13190 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
131a0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
131b0 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
131c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
131d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
131e0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
131f0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
13200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13210 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13220 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
13230 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13240 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13250 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
13260 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
13270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
13290 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
132a0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
132b0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
132c0 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
132d0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
132e0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
132f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13300 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
13310 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
13320 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
13330 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
13340 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
13350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13360 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
13370 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
13380 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
13390 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
133a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
133b0 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
133c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
133d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
133e0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
133f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13400 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13410 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
13420 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
13430 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
13440 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13450 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
13460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13480 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
13490 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
134a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
134b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
134c0 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
134d0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
134e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
134f0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
13500 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
13510 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
13520 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
13530 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
13540 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
13550 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
13560 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13570 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
13580 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
13590 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
135a0 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
135b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
135c0 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
135d0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
135e0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
135f0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
13600 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
13610 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
13620 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
13630 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
13640 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
13650 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
13660 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13670 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
13680 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
13690 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
136a0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
136b0 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
136c0 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
136d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
136e0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
136f0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
13700 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
13710 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
13720 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
13730 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
13740 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
13750 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
13760 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
13770 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
13780 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
13790 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
137a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
137b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
137c0 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
137d0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
137e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
137f0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
13800 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13820 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
13830 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
13840 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
13850 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13860 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13870 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
13880 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
13890 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
138a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
138b0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
138c0 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
138d0 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
138e0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
138f0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
13900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
13910 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
13920 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
13930 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
13940 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
13950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
13960 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
13970 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
13980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13990 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
139a0 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
139b0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
139c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
139d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
139e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
139f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
13a10 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
13a20 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
13a30 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
13a40 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
13a50 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
13a60 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13a70 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13a80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
13a90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13aa0 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
13ab0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
13ac0 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
13ad0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
13ae0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
13af0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
13b00 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
13b10 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
13b20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13b30 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13b40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
13b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13b60 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13b70 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13b80 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
13b90 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
13ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13bb0 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
13bc0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
13bd0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
13be0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
13bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13c00 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
13c10 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
13c20 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
13c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13c40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
13c50 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
13c60 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
13c70 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
13c80 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
13c90 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
13ca0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
13cb0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
13cc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13cd0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
13ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13cf0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
13d00 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
13d10 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
13d20 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
13d30 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
13d40 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
13d50 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13d60 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
13d70 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
13d80 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
13d90 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
13da0 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
13dd0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
13de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13e10 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
13e20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
13e30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
13e40 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
13e50 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
13e60 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
13e70 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
13e80 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
13e90 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
13ea0 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
13eb0 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13ec0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
13ed0 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
13ee0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
13ef0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
13f00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
13f10 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
13f20 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
13f30 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13f40 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13f50 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
13f60 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
13f70 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
13f80 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
13f90 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
13fa0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
13fb0 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
13fc0 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
13fd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
13fe0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
13ff0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
14000 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
14010 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
14020 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
14030 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
14040 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
14050 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14060 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
14070 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
14080 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
14090 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
140a0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
140b0 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
140c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
140d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
140e0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
140f0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
14100 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
14110 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
14120 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
14130 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
14140 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
14150 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
14160 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
14170 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
14180 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
14190 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
141a0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
141b0 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
141c0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
141d0 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
141e0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
141f0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
14200 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
14210 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
14220 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
14230 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14240 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
14250 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
14260 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
14270 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
14280 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
14290 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
142a0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
142b0 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
142c0 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
142d0 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
142e0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
142f0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
14300 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
14310 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
14320 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
14330 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
14340 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
14350 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
14360 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
14370 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
14380 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
14390 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
143a0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
143b0 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
143c0 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
143d0 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
143e0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
143f0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
14400 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
14410 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
14420 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
14430 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
14440 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
14450 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
14460 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
14470 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
14480 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
14490 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
144a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
144b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
144c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
144d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
144e0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
144f0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
14500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
14510 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
14520 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
14530 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
14540 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14550 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
14560 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14570 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
14580 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14590 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
145a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
145b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
145c0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
145d0 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
145e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
145f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
14600 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
14610 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
14620 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
14630 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
14640 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
14650 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
14660 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
14670 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14680 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
14690 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
146a0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
146b0 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
146c0 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
146d0 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
146e0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
146f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14700 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
14710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
14720 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
14730 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14740 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
14750 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14760 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
14770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14780 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14790 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
147a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
147b0 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
147c0 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
147d0 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
147e0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
147f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
14800 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
14810 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
14820 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
14830 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
14840 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
14850 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14860 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14890 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
148c0 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
148d0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
148e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
148f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14900 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
14930 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
14940 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
14950 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
14960 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
14970 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
14980 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
14990 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
149a0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
149b0 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
149c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
149d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
149e0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
149f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14a00 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14a10 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
14a20 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
14a30 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
14a40 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
14a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14a60 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
14a70 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
14a80 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
14a90 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
14aa0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14ab0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
14ac0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14ad0 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
14ae0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
14af0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
14b00 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
14b10 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
14b20 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
14b30 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
14b40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14b50 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
14b60 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14b70 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
14b80 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14b90 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
14ba0 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
14bb0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
14bc0 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
14bd0 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
14be0 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
14bf0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
14c00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
14c10 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14c20 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
14c30 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
14c40 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
14c50 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
14c60 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
14c70 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
14c80 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
14c90 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
14ca0 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
14cb0 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
14cc0 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
14cd0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
14ce0 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
14cf0 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
14d00 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
14d10 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14d20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14d30 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
14d40 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
14d50 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
14d60 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
14d70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14d80 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14d90 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
14da0 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
14db0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14dc0 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
14dd0 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
14de0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14df0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
14e00 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
14e10 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
14e20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
14e30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14e50 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
14e60 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
14e70 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
14e80 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14e90 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
14ea0 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
14eb0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
14ec0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
14ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14ee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
14ef0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
14f00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
14f10 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
14f40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14f50 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
14f60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14f70 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
14f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14fa0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
14fb0 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
14fc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
14fd0 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
14fe0 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
14ff0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15000 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
15010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15020 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15030 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
15040 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
15050 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
15060 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
15070 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
15080 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
15090 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
150a0 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
150b0 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
150c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
150d0 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
150e0 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
150f0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
15100 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  = 0;.  ExplainQu
15110 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15120 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20   1, "SETUP"));. 
15130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15140 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
15150 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
15160 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15170 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
15180 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
15190 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
151a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
151b0 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
151c0 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
151d0 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
151e0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
151f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15200 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
15210 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
15220 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
15230 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
15240 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
15250 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
15260 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15270 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
15280 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
15290 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
152a0 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
152b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
152c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
152e0 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
152f0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
15300 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
15310 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
15320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15330 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
15340 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
15350 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15360 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
15370 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
15380 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
15390 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
153a0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
153b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
153c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
153d0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
153e0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
153f0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
15400 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15410 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
15420 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
15430 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
15440 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
15450 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15470 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15480 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15490 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
154a0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
154b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
154c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
154d0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
154e0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
154f0 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
15500 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
15510 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
15520 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
15530 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
15540 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
15550 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
15560 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
15570 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15580 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15590 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
155a0 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
155b0 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
155c0 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
155d0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
155e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
155f0 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
15600 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15610 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
15620 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
15630 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15640 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
15650 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
15670 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15680 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15690 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
156a0 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
156b0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
156c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
156d0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
156e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15700 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
15710 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
15720 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15730 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15740 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15750 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15760 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15770 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15780 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15790 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
157a0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
157b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
157c0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
157d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
157e0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
157f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15800 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15810 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15820 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15830 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15840 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15850 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15860 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15870 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15880 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15890 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
158a0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
158b0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
158c0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
158d0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
158e0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
158f0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
15900 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
15910 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
15920 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15930 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15940 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15950 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15960 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15970 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15980 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15990 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
159a0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
159b0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
159c0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
159d0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
159e0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
159f0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
15a00 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
15a10 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
15a20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15a30 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15a40 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15a50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15a70 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a80 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a90 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15aa0 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15ab0 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15ac0 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15ad0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15ae0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15af0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15b00 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15b10 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15b20 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15b30 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15b40 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15b50 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15b60 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15b70 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b80 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b90 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15ba0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15bb0 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15bc0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15bd0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15be0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15bf0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15c00 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15c10 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15c20 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15c30 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15c40 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15c50 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15c60 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15c70 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c80 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c90 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15ca0 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15cb0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15cc0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15cd0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15ce0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15cf0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15d00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15d10 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15d20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15d30 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d50 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15d60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15d70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d80 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d90 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15db0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15dc0 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15dd0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15de0 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15df0 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15e00 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15e10 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15e20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15e30 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15e60 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15e70 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e80 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e90 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15ea0 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15eb0 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15ec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15ee0 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15ef0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15f20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15f30 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15f40 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15f50 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15f60 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15f70 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f80 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f90 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15fa0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15fb0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15fc0 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15fd0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15fe0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15ff0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
16000 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
16010 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
16020 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
16030 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
16040 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
16050 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16060 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
16070 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16080 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16090 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
160a0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
160b0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
160c0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
160d0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
160e0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
160f0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
16100 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
16110 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
16120 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
16130 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
16140 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
16150 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16160 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
16170 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16180 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16190 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
161a0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
161b0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
161c0 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
161d0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
161e0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161f0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
16200 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
16210 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
16220 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
16230 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
16240 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
16250 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
16260 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
16270 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16280 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16290 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
162a0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
162b0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
162c0 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
162d0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
162e0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
162f0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
16300 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
16310 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
16320 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
16330 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
16340 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
16350 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
16360 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
16370 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16380 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16390 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
163a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
163b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
163d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
163e0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
163f0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
16400 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
16410 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
16420 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16430 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16440 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
16450 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
16460 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
16470 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16480 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16490 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
164a0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
164b0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
164c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
164d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164e0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
164f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16500 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
16510 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
16520 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
16530 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
16540 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
16550 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
16560 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
16570 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16580 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16590 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
165a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
165b0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
165c0 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
165d0 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
165e0 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
165f0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
16600 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
16610 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
16620 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
16630 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
16640 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
16650 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
16660 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
16670 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16680 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16690 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
166a0 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
166b0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
166c0 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
166d0 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70  NION );.  db = p
166e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
166f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
16700 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
16710 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
16720 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69  pOrderBy || pPri
16730 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
16740 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16750 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61  g(pParse,"%s cla
16760 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
16770 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
16780 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69  ore",.      pPri
16790 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20  or->pOrderBy!=0 
167a0 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22  ? "ORDER BY" : "
167b0 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70  LIMIT", selectOp
167c0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
167d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
167e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
167f0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
16800 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16810 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
16820 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
16830 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
16840 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
16850 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
16860 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
16870 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
16880 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
16890 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
168a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
168b0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
168d0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
168e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
168f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16900 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
16910 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16920 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
16930 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
16940 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
16950 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
16960 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
16970 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
16980 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
16990 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
169a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
169b0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
169c0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
169d0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
169e0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
169f0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16a00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
16a10 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
16a20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
16a30 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
16a40 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16a50 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
16a60 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
16a70 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
16a80 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
16a90 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
16aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16ab0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
16ac0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
16ad0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
16ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
16af0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16b00 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
16b10 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
16b20 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
16b30 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
16b40 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
16b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
16b60 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
16b70 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
16b80 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
16b90 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
16ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16bb0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16bc0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
16bd0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
16be0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
16bf0 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53  else{..#ifndef S
16c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
16c10 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f  IN.    if( pPrio
16c20 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
16c30 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16c40 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16c50 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45  1, "COMPOUND QUE
16c60 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70  RY"));.      Exp
16c70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c80 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d  Parse, 1, "LEFT-
16c90 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29  MOST SUBQUERY"))
16ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
16cb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16cc0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
16cd0 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
16ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
16cf0 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68     */.    switch
16d00 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
16d10 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
16d20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
16d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
16d40 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
16d50 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
16d60 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
16d70 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
16d80 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
16d90 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16da0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
16db0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
16dc0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
16dd0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
16de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16df0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16e00 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
16e10 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
16e20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16e30 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
16e40 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16e50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
16e60 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
16e70 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
16e80 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
16e90 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
16ea0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
16eb0 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
16ec0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16ed0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16ee0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16f00 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69  , OP_IfNot, p->i
16f10 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
16f20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
16f30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16f40 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
16f50 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
16f60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
16f70 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
16f80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16fa0 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16fd0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
16fe0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
16ff0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
17000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17010 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17020 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17030 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20  "UNION ALL"));. 
17040 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17050 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17060 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
17070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
17090 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
170a0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
170b0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
170c0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
170d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
170e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
170f0 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
17100 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17110 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Row);.        if
17120 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
17130 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
17140 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
17150 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
17160 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74  ->pLeft, &nLimit
17170 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c  ).         && nL
17180 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
17190 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
171a0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
171b0 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b  mit) .        ){
171c0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
171d0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
171e0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
171f0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  imit);.        }
17200 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
17210 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
17220 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17230 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
17240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
17250 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17260 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
17270 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  PT:.      case T
17280 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
17290 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
172a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
172b0 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
172c0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
172d0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20  esult */.       
172e0 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
172f0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
17300 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
17310 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
17320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17330 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
17340 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
17350 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
17360 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
17370 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
17380 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65  imit;    /* Save
17390 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
173a0 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20  Limit  */.      
173b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
173c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
173d0 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20  niondest;.  .   
173e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
173f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
17400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17410 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
17420 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
17430 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
17440 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
17450 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
17460 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
17470 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
17480 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
17490 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
174a0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
174b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69  .          ** ri
174c0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ght..          *
174d0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
174e0 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
174f0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
17500 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
17510 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
17520 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
17530 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
17540 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  m;.        }else
17550 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
17560 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
17570 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
17580 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
17590 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
175a0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
175b0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
175c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
175d0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
175e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
175f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17600 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
17610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
17620 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17630 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17640 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
17650 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17660 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
17670 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
17680 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
17690 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
176a0 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
176b0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
176c0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
176d0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
176e0 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  eral;.          
176f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17700 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t );.        }. 
17710 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17720 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
17730 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
17740 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  eft.        */. 
17750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17760 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
17770 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17780 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17790 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
177a0 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
177b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
177c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
177d0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
177e0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
177f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17800 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17810 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
17820 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17830 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
17840 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
17850 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
17860 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
17870 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
17880 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  {.          op =
17890 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
178a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
178b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
178c0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
178d0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
178e0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
178f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
17900 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17910 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
17920 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
17930 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
17940 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74         uniondest
17950 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
17960 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17970 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17980 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50  , "%s USING TEMP
17990 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20   B-TREE",.      
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
179c0 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20  (p->op)));.     
179d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
179e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
179f0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  .        /* Quer
17a30 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
17a40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
17a50 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
17a60 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
17a70 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
17a80 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
17a90 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
17aa0 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
17ab0 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
17ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17ad0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
17ae0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
17af0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17b00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b10 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17b20 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  r;.        p->pO
17b30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
17b40 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
17b50 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
17b60 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17b70 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17b80 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17b90 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17ba0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17bc0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17bd0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
17be0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17bf0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
17c00 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
17c10 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17c20 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20  set = 0;.  .    
17c30 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
17c40 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
17c50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
17c60 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
17c70 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  m.        ** it 
17c80 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
17c90 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
17ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17cb0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
17cc0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
17cd0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17ce0 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rOp );.        i
17cf0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
17d00 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17d10 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
17d20 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17d30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17d40 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17d50 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
17d60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17d70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17d80 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
17d90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17da0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  (v);.          c
17db0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
17dc0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
17dd0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17df0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17e00 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
17e10 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17e20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
17e30 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
17e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17e50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17e60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17e70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17e80 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
17ea0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
17eb0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17ed0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17ee0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
17ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f00 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17f10 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
17f20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17f30 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17f40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17f50 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17f60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f80 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
17f90 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17fa0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17fc0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
17fd0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
17fe0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
17ff0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
18000 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
18010 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
18020 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  art;.        Exp
18030 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r *pLimit;.     
18040 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
18050 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
18060 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
18070 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20         int r1;. 
18080 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54   .        /* INT
18090 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
180a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
180b0 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
180c0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
180d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
180e0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
180f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
18100 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
18110 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
18120 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
18130 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
18140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
18150 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
18160 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61  ab++;.        ta
18170 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
18180 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
18190 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
181a0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
181b0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
181c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
181e0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
181f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
18200 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
18210 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
18220 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
18230 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
18240 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
18250 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
18260 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
18270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18280 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18290 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
182a0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
182b0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
182c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
182d0 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ab1"..        */
182e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
182f0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
18300 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
18310 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
18320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18330 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18340 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
18350 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
18360 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
18370 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
18380 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18390 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
183a0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
183b0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
183c0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
183d0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
183e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
183f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18410 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
18420 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  2, 0);.        a
18430 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
18440 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
18450 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
18460 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
18470 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
18480 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18490 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
184a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
184b0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
184c0 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63          intersec
184d0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
184e0 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78  tab2;.        Ex
184f0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18500 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
18510 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
18520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
18540 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
18550 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
18560 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18570 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
18580 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
18590 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
185a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
185b0 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
185c0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
185d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
185e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
185f0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
18600 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
18610 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
18620 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
18630 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
18640 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
18650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18660 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
18670 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
18680 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
18690 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  mit;.  .        
186a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
186b0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
186c0 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
186d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
186e0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
186f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18710 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
18720 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
18730 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18740 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
18750 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18760 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18770 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
18780 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
18790 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
187a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
187b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
187c0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
187d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
187e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  ge(v);.        r
187f0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18800 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18810 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
18820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18830 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
18840 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
18850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18860 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
18870 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
18880 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
18890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
188a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
188b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
188c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
188d0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
188e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
188f0 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
18920 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
18930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18950 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
18960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18970 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
18980 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
18990 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
189a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
189c0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
189d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
189e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
189f0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
18a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18a20 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
18a30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
18a50 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
18a60 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
18a70 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
18a80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
18a90 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
18aa0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23  arse);.    }.  #
18ab0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
18ac0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
18ad0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
18ae0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
18af0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
18b00 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
18b10 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
18b20 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
18b30 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
18b40 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
18b50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
18b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
18b70 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
18b80 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
18b90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18ba0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
18bb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
18bc0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
18bd0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
18be0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
18bf0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
18c00 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
18c10 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
18c20 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
18c30 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
18c40 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
18c50 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
18c60 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
18c70 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
18c80 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
18c90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18cb0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
18cc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18cd0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
18ce0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
18cf0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
18d00 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
18d10 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18d40 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
18d50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
18d60 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18d80 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
18d90 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
18da0 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
18db0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18dd0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18de0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
18df0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
18e00 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
18e10 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
18e20 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
18e30 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
18e40 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
18e50 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
18e60 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
18e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18e80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
18e90 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18ea0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
18eb0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
18ec0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
18ed0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
18ee0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
18ef0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
18f00 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
18f10 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
18f20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
18f30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
18f40 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
18f50 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18f60 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
18f70 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
18f80 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
18f90 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
18fa0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
18fb0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
18fc0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
18fd0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
18fe0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
19000 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
19010 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
19020 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
19030 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
19040 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
19050 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
19060 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
19070 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
19080 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19090 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
190a0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
190b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
190c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
190d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
190e0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
190f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
19100 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
19110 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
19120 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
19130 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
19160 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
19170 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19180 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
19190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
191a0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
191b0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
191c0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
191d0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
191e0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
191f0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
19200 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
19210 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
19220 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
19230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19240 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19250 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
19260 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
19270 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
19280 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
19290 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
192a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
192b0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
192c0 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
192d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
192e0 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
192f0 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
19300 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
19310 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
19320 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
19330 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
19340 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19350 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
19360 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
19370 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
19380 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
19390 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
193a0 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
193b0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
193c0 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
193d0 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
193e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
193f0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19400 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
19410 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
19420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
19430 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
19440 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
19450 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
19460 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
19470 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
19480 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
19490 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
194a0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
194b0 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
194c0 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
194d0 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
194e0 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
194f0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
19500 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
19510 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
19520 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19530 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
19540 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
19550 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
19560 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
19570 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19580 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
19590 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
195a0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
195b0 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
195c0 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
195d0 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
195e0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
195f0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
19600 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
19610 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
19620 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
19630 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
19640 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
19650 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
19660 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
19670 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
19680 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
19690 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
196a0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
196b0 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
196c0 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
196d0 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
196e0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
196f0 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
19700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19710 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
19730 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
19740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
19750 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
19760 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
19770 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
19780 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
19790 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
197a0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
197b0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
197c0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
197d0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
197e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
197f0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
19800 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
19810 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
19820 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
19830 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
19840 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
19850 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
19860 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
19870 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
19880 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
19890 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
198a0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
198b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
198c0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
198d0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
198e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
198f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
19900 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
19910 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
19920 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19930 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
19940 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
19950 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19960 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19970 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19980 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
19990 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
199a0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
199b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
199c0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
199d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
199e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
199f0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19a00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a10 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
19a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19a30 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
19a40 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a50 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a80 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19a90 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19aa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ac0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19ad0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19ae0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19af0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19b10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b40 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19b50 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19b60 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19b90 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19ba0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19bc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19bd0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19be0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19bf0 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19c00 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19c10 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19c20 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19c30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19c40 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19c50 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19c60 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19c70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c80 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19c90 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19cb0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19cc0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19cd0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19ce0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19cf0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19d00 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19d10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d20 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19d30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19d40 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d60 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19d70 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19db0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19dc0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19de0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19df0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19e00 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19e30 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19e40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e60 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e80 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19ea0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19eb0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ec0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19ed0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19ee0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19ef0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19f00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19f10 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19f20 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19f30 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19f40 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19f50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19f60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f80 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19f90 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19fa0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19fb0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19fc0 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1a000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a030 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1a040 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
1a050 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
1a060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1a080 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a090 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a0a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a0b0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
1a0c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a0d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1a0e0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1a0f0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1a100 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a110 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
1a120 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1a130 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
1a140 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
1a150 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
1a160 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
1a170 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1a180 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
1a190 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a1a0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
1a1b0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1a1c0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70   );  testcase( p
1a1d0 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a  In->nSdst!=1 );.
1a1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a1f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a200 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a210 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
1a220 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
1a230 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
1a240 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
1a250 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
1a260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a270 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
1a280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a290 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1a2a0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
1a2b0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
1a2c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1a2d0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1a2e0 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
1a2f0 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
1a300 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
1a310 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
1a320 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
1a330 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
1a340 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
1a360 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
1a370 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1a380 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
1a390 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
1a3a0 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
1a3b0 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
1a3c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a3d0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
1a3e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
1a3f0 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  t->iSdst, pIn->n
1a400 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a410 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a420 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
1a430 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
1a440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a450 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
1a460 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
1a470 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
1a480 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
1a490 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
1a4a0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
1a4b0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
1a4c0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
1a4d0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
1a4e0 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
1a4f0 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
1a500 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
1a510 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
1a520 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
1a530 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
1a540 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a550 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a560 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
1a570 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
1a580 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
1a590 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
1a5a0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
1a5b0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
1a5c0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
1a5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
1a5e0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
1a5f0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
1a600 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
1a610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a630 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
1a640 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a650 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a660 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a670 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a680 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a690 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a6a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a6b0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a6c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
1a6d0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
1a6e0 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
1a6f0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a720 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
1a730 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
1a740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a750 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a760 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
1a770 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
1a780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
1a7a0 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
1a7b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a7c0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
1a7d0 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
1a7e0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
1a7f0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
1a800 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
1a810 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
1a820 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
1a830 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
1a840 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
1a850 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
1a860 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
1a870 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
1a880 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
1a890 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
1a8a0 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
1a8b0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
1a8c0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1a8d0 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
1a8e0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
1a8f0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
1a900 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
1a910 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
1a920 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
1a930 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
1a940 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a950 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
1a960 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
1a970 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
1a980 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
1a990 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1a9a0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1a9b0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
1a9c0 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
1a9d0 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
1a9e0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
1a9f0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
1aa00 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
1aa10 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
1aa20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1aa30 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
1aa40 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1aa50 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1aa60 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1aa70 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1aa80 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
1aa90 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aaa0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
1aab0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aac0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aad0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aae0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1aaf0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
1ab00 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
1ab10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
1ab20 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
1ab30 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
1ab40 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
1ab50 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
1ab60 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
1ab70 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
1ab80 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
1ab90 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
1aba0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
1abb0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1abc0 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
1abd0 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
1abe0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1abf0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ac00 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
1ac10 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
1ac20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1ac30 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1ac40 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1ac50 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
1ac60 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
1ac70 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ac80 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1ac90 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
1aca0 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
1acb0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
1acc0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
1acd0 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
1ace0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1acf0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
1ad00 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
1ad10 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
1ad20 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
1ad30 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
1ad40 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1ad50 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
1ad60 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
1ad70 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
1ad80 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
1ad90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1ada0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1adb0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1adc0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1add0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
1ade0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1adf0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae00 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1ae10 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
1ae20 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
1ae30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ae40 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
1ae50 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae60 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae70 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
1ae80 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1ae90 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1aea0 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
1aeb0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
1aec0 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
1aed0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1aee0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aef0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
1af00 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1af10 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
1af20 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
1af30 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
1af40 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af50 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
1af60 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
1af70 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
1af80 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
1af90 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
1afa0 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
1afb0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1afc0 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
1afd0 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
1afe0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
1aff0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1b000 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
1b010 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
1b020 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
1b030 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
1b040 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
1b050 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
1b060 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
1b070 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1b080 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
1b090 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
1b0a0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
1b0b0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
1b0c0 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
1b0d0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
1b0e0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
1b0f0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
1b100 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
1b110 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
1b120 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
1b130 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
1b140 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
1b150 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
1b160 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
1b170 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
1b180 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
1b190 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
1b1a0 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
1b1b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b1c0 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
1b1d0 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
1b1e0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
1b1f0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
1b200 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
1b210 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
1b220 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
1b230 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
1b240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
1b250 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
1b260 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
1b270 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
1b280 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
1b290 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
1b2a0 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
1b2b0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
1b2c0 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
1b2d0 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
1b2e0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
1b2f0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
1b300 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
1b310 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
1b320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
1b330 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
1b340 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
1b350 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
1b360 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
1b370 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
1b380 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b390 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
1b3a0 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
1b3b0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
1b3c0 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
1b3d0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
1b3e0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
1b3f0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
1b400 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
1b410 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
1b420 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
1b430 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
1b440 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
1b450 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
1b460 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
1b470 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
1b480 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
1b490 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
1b4a0 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
1b4b0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
1b4c0 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
1b4d0 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
1b4e0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
1b4f0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
1b500 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
1b510 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
1b520 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
1b530 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
1b540 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
1b550 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b560 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1b570 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
1b580 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
1b590 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
1b5a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1b5b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b5c0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b5d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1b5e0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b5f0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
1b600 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
1b610 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
1b620 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1b630 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
1b640 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1b650 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1b660 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b670 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1b680 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
1b690 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
1b6a0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
1b6b0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
1b6c0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b6d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b6e0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
1b6f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b700 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
1b710 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
1b720 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
1b730 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
1b740 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b750 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b760 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
1b770 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
1b780 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b790 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b7a0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b7b0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
1b7c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b7d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1b7e0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b800 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
1b810 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b820 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
1b830 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b840 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
1b850 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b860 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b870 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
1b880 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b890 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b8a0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
1b8b0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8c0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
1b8d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b8e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
1b8f0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
1b900 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b910 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
1b920 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b930 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b940 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b950 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
1b960 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b970 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b980 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b990 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
1b9a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b9b0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
1b9c0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
1b9d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9e0 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
1b9f0 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
1ba00 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
1ba10 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
1ba20 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
1ba30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba40 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
1ba50 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1ba60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba70 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
1ba80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba90 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
1baa0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
1bab0 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
1bac0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
1bad0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
1bae0 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
1baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb00 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
1bb10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bb20 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
1bb30 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
1bb40 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1bb50 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
1bb60 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
1bb70 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1bb80 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1bb90 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
1bba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
1bbb0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
1bbc0 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
1bbd0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
1bbe0 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
1bbf0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bc00 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
1bc10 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
1bc20 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
1bc30 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc40 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
1bc50 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
1bc60 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bc70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc80 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1bc90 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
1bca0 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
1bcb0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
1bcc0 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
1bcd0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
1bce0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
1bcf0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
1bd00 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1bd10 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
1bd20 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bd40 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
1bd50 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
1bd60 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
1bd70 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bd80 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
1bd90 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bda0 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
1bdb0 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
1bdc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
1bdd0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
1bde0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
1bdf0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
1be00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1be10 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
1be20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be30 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1be40 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
1be50 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1be60 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
1be70 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1be80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1be90 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1bea0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1beb0 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
1bec0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
1bed0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
1bee0 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
1bef0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
1bf00 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1bf10 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1bf20 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1bf30 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1bf40 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1bf50 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1bf60 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1bf70 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1bf80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1bf90 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1bfa0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1bfb0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1bfc0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1bfd0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1bfe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bff0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
1c000 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
1c010 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1c020 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
1c030 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
1c040 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
1c050 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
1c060 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1c070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
1c080 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
1c090 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
1c0a0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
1c0b0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
1c0c0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
1c0d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1c0e0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
1c0f0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
1c100 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
1c110 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1c120 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
1c130 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
1c140 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
1c150 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1c160 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
1c170 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
1c180 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
1c190 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
1c1a0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
1c1b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
1c1c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
1c1d0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
1c1e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c1f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1c200 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
1c220 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
1c230 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
1c240 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1c250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c260 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1c270 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
1c280 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
1c290 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
1c2a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c2b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
1c2c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1c2d0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
1c2e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1c2f0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
1c300 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c310 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c320 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1c330 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1c340 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
1c350 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
1c360 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
1c370 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
1c380 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
1c390 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c3a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c3b0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
1c3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
1c3d0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
1c3e0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
1c3f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
1c400 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
1c410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c420 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
1c430 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
1c440 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
1c450 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
1c460 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
1c470 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
1c480 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
1c490 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
1c4a0 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
1c4b0 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
1c4c0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
1c4d0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
1c4e0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
1c4f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c500 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
1c510 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
1c520 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
1c530 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
1c540 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
1c550 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
1c560 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
1c570 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
1c580 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
1c590 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1c5a0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
1c5b0 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20  OrderBy + 1));. 
1c5c0 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
1c5d0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1c5e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c5f0 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30  ;.    aPermute[0
1c600 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ] = nOrderBy;.  
1c610 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d    for(i=1, pItem
1c620 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
1c630 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  =nOrderBy; i++, 
1c640 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c650 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1c660 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1c670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c680 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c690 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
1c6a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1c6b0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
1c6c0 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
1c6d0 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
1c6e0 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
1c6f0 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
1c700 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
1c710 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
1c720 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
1c730 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
1c740 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
1c750 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c760 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
1c770 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
1c780 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1c790 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
1c7a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c7b0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1c7c0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
1c7d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1c7e0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
1c7f0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
1c800 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
1c810 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
1c820 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
1c830 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
1c840 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
1c850 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
1c860 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
1c870 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
1c880 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
1c890 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
1c8a0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1c8b0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
1c8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c8d0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
1c8e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
1c8f0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
1c900 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
1c910 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1c920 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
1c930 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1c940 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1c950 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
1c960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c970 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1c980 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
1c990 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
1c9a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
1c9b0 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
1c9c0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
1c9d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c9e0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
1c9f0 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
1ca00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ca10 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
1ca20 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca30 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
1ca40 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
1ca50 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
1ca60 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1ca70 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ca90 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
1caa0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
1cab0 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
1cac0 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
1cad0 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
1cae0 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
1caf0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
1cb00 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1cb10 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1cb20 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
1cb30 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
1cb40 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
1cb50 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1cb60 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1cb70 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
1cb80 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
1cb90 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1cba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1cbb0 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
1cbc0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
1cbd0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1cbe0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
1cbf0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
1cc00 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
1cc10 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1cc20 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
1cc30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
1cc40 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
1cc50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1cc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cc70 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
1cc80 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
1cc90 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
1cca0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
1ccd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1ccf0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
1cd00 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
1cd10 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
1cd20 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
1cd30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1cd40 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1cd50 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
1cd60 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65  Limit = 0;..  re
1cd70 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
1cd80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
1cd90 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
1cda0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
1cdb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cdc0 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
1cdd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cde0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1cdf0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
1ce00 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1ce10 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1ce20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1ce30 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
1ce40 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
1ce50 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ;..  ExplainQuer
1ce60 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1ce70 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c 20  , "MERGE (%s)", 
1ce80 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
1ce90 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  op)));..  /* Gen
1cea0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1ceb0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cec0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ced0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1cee0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1cef0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1cf00 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1cf10 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1cf20 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1cf30 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1cf40 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1cf50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cf60 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1cf70 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1cf80 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1cf90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1cfa0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1cfb0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1cfc0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1cfd0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1cfe0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1cff0 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69 74  LEFT"));.  sqlit
1d000 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1d010 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
1d020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d030 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d040 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1d050 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1d060 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a  v, addr1);..  /*
1d070 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1d080 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1d090 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1d0a0 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
1d0b0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
1d0c0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
1d0d0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
1d0e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1d0f0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1d100 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1d110 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d120 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1d130 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64  regAddrB, 0, add
1d140 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62  rSelectB);.  Vdb
1d150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69  eComment((v, "ri
1d160 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
1d170 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
1d180 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
1d190 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
1d1a0 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
1d1b0 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
1d1c0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
1d1d0 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79   .  ExplainQuery
1d1e0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1d1f0 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73 71   "RIGHT"));.  sq
1d200 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1d210 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1d220 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1d230 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1d240 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1d250 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1d260 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1d270 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1d280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d290 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d2a0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d2b0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1d2c0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d2d0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d2e0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d2f0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d300 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d310 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1d320 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1d330 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1d340 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d350 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d370 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1d380 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d3a0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d3b0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1d3c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d3d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d3e0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d3f0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1d400 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d410 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d420 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d430 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1d440 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1d450 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1d460 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d470 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d480 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1d490 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1d4a0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d4b0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4d0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1d4e0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d500 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d510 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1d520 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1d530 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1d540 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d550 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1d560 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1d570 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1d580 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1d590 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1d5a0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1d5b0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1d5c0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1d5d0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1d5e0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d5f0 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1d600 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1d610 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1d620 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d630 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1d640 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1d650 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1d660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d670 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1d680 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1d690 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1d6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d6b0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d6c0 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d700 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d710 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d720 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1d730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1d740 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1d750 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1d760 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d780 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1d790 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1d7a0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1d7b0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1d7c0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1d7d0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1d7e0 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1d7f0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1d800 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1d810 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1d820 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1d840 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d850 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1d860 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1d870 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1d880 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1d890 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1d8a0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1d8b0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1d8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1d8e0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1d8f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d910 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1d920 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1d930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d940 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d950 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1d960 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d970 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1d980 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1d990 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d9a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1d9b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d9c0 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1d9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d9e0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1d9f0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1da00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1da10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da30 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da40 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1da50 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1da60 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1da70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1da80 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1da90 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1daa0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1dab0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1dac0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1dad0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1dae0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1daf0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1db00 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1db10 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1db20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1db30 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1db40 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1db50 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1db60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db70 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1db80 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1db90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dba0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1dbb0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1dbc0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1dbd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1dbe0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1dbf0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1dc00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1dc10 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1dc20 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1dc30 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1dc40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1dc50 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1dc60 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1dc70 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1dc80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1dca0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1dcb0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1dcc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dcd0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1dce0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1dcf0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1dd00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1dd10 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1dd20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1dd30 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1dd40 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1dd50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dd60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1dd70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1dd80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dd90 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1dda0 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1ddb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ddc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ddd0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dde0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1ddf0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1de00 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1de10 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1de20 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1de30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1de50 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1de60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1de70 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1de80 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1de90 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1dea0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1deb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1dec0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1ded0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1dee0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1df10 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1df20 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1df30 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1df40 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1df50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df60 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1df70 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1df80 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1df90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dfa0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1dfb0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1dfc0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1dfd0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1dfe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e000 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1e010 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1e020 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1e030 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1e040 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1e050 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1e060 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1e070 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1e080 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1e090 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1e0a0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1e0b0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1e0c0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1e0d0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1e0e0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1e0f0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1e100 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1e110 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1e120 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1e130 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61  es ****/.  Expla
1e140 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
1e150 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
1e160 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1e170 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1e180 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e190 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1e1a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1e1b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a  E_OMIT_VIEW)../*
1e1c0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1e1d0 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74  the SubstContext
1e1e0 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
1e1f0 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f  s an substitutio
1e200 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20  n edit.** to be 
1e210 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70  performed on a p
1e220 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  arse tree..**.**
1e230 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   All references 
1e240 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
1e250 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20 74  ble iTable are t
1e260 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  o be replaced by
1e270 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1e280 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
1e290 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65   pEList..*/.type
1e2a0 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73 74  def struct Subst
1e2b0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73  Context {.  Pars
1e2c0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1e2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e2e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e2f0 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20    int iTable;   
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e310 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65  eplace reference
1e320 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
1e330 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62  */.  int iNewTab
1e340 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
1e350 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62  * New table numb
1e360 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  er */.  int isLe
1e370 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20  ftJoin;         
1e380 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e    /* Add TK_IF_N
1e390 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20  ULL_ROW opcodes 
1e3a0 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d  on each replacem
1e3b0 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ent */.  ExprLis
1e3c0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1e3d0 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e     /* Replacemen
1e3e0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  t expressions */
1e3f0 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b  .} SubstContext;
1e400 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  ../* Forward Dec
1e410 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1e420 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1e430 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74  prList(SubstCont
1e440 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  ext*, ExprList*)
1e450 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1e460 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74 43  bstSelect(SubstC
1e470 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a  ontext*, Select*
1e480 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1e490 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1e4a0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1e4b0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1e4c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1e4d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1e4e0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1e4f0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1e500 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1e510 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1e520 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1e530 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1e540 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1e550 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1e560 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e570 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1e580 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1e590 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1e5a0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1e5b0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1e5c0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1e5d0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1e5e0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1e5f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1e600 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1e610 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1e620 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1e630 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1e640 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1e650 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
1e660 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1e670 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1e680 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1e690 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1e6a0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1e6b0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1e6c0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1e6d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1e6e0 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1e6f0 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1e700 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  pr(.  SubstConte
1e710 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20  xt *pSubst,  /* 
1e720 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1e730 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1e740 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1e760 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1e770 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1e780 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1e790 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1e7a0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
1e7b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e7c0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
1e7d0 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  & pExpr->iRightJ
1e7e0 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  oinTable==pSubst
1e7f0 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20  ->iTable.  ){.  
1e800 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1e810 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1e820 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1e830 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1e840 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1e850 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1e860 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1e870 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1e880 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1e890 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1e8a0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1e8b0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1e8c0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1e8d0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1e8e0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1e8f0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1e900 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1e910 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1e920 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1e930 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1e940 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1e950 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1e960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e970 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1e980 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
1e990 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1e9a0 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20  or(pCopy) ){.   
1e9b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74       sqlite3Vect
1e9c0 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73  orErrorMsg(pSubs
1e9d0 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79  t->pParse, pCopy
1e9e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
1ea00 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50  *db = pSubst->pP
1ea10 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
1ea20 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73    if( pSubst->is
1ea30 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70  LeftJoin && pCop
1ea40 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  y->op!=TK_COLUMN
1ea50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1ea60 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c  mset(&ifNullRow,
1ea70 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c   0, sizeof(ifNul
1ea80 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20  lRow));.        
1ea90 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d    ifNullRow.op =
1eaa0 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b   TK_IF_NULL_ROW;
1eab0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1eac0 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f  lRow.pLeft = pCo
1ead0 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  py;.          if
1eae0 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d  NullRow.iTable =
1eaf0 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1eb00 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  le;.          pC
1eb10 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77  opy = &ifNullRow
1eb20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb30 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1eb40 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
1eb50 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  opy, 0);.       
1eb60 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 53 75   if( pNew && pSu
1eb70 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1eb80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
1eb90 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1eba0 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  w, EP_CanBeNull)
1ebb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ebc0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1ebd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ebe0 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69  pExpr,EP_FromJoi
1ebf0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
1ec00 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  pNew->iRightJoin
1ec10 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1ec20 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1ec30 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1ec40 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  tProperty(pNew, 
1ec50 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1ec60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec70 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1ec80 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1ec90 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
1eca0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
1ecb0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1ecc0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1ecd0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20  _IF_NULL_ROW && 
1ece0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1ecf0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1ed00 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
1ed10 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1ed20 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  NewTable;.    }.
1ed30 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1ed40 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ed50 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  bst, pExpr->pLef
1ed60 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1ed70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1ed80 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ed90 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
1eda0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1edb0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1edc0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1edd0 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62  substSelect(pSub
1ede0 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  st, pExpr->x.pSe
1edf0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  lect, 1);.    }e
1ee00 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1ee10 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1ee20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1ee30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ee40 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1ee50 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1ee60 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74  xprList(.  Subst
1ee70 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1ee80 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ee90 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1eea0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1eeb0 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f  t *pList       /
1eec0 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1eed0 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1eee0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1eef0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1ef00 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1ef10 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1ef20 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1ef30 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1ef40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1ef50 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1ef60 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
1ef70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Expr);.  }.}.sta
1ef80 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1ef90 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  lect(.  SubstCon
1efa0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1efb0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1efc0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1efd0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1eff0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f000 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1f010 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1f020 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1f040 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70  substitutes on p
1f050 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a  ->pPrior too */.
1f060 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1f070 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1f080 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1f090 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1f0a0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1f0b0 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  do{.    substExp
1f0c0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1f0d0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
1f0e0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1f0f0 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  st, p->pGroupBy)
1f100 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1f110 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  ist(pSubst, p->p
1f120 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
1f130 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1f140 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e  Expr(pSubst, p->
1f150 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d  pHaving);.    p-
1f160 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1f170 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1f180 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63  Where);.    pSrc
1f190 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1f1a0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1f1b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  );.    for(i=pSr
1f1c0 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1f1d0 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1f1e0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f1f0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1f200 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65  ubst, pItem->pSe
1f210 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  lect, 1);.      
1f220 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f230 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1f240 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f250 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f260 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1f270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
1f280 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26  hile( doPrior &&
1f290 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29   (p = p->pPrior)
1f2a0 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  !=0 );.}.#endif 
1f2b0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1f2c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f2d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1f2e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1f2f0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1f300 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f310 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f320 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f330 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1f340 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1f350 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1f360 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1f370 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1f380 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1f390 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1f3a0 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1f3b0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1f3c0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1f3d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1f3e0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1f3f0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1f400 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1f410 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1f420 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1f430 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1f440 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1f450 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1f460 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1f470 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1f480 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1f490 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1f4a0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1f4b0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1f4c0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1f4d0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1f4e0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1f4f0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1f500 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1f510 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1f520 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1f530 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1f540 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1f550 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1f560 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1f570 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1f580 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1f590 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1f5a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1f5b0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1f5c0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1f5d0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1f5e0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1f5f0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1f600 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1f610 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1f620 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1f630 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1f640 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1f650 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1f660 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1f670 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1f680 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1f690 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1f6a0 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1f6b0 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1f6c0 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1f6d0 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1f6e0 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1f6f0 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1f700 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1f710 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1f720 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1f730 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1f740 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73   Flattening is s
1f750 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
1f760 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69  llowing constrai
1f770 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  nts:.**.**  (**)
1f780 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1f790 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1f7a0 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1f7b0 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20  ueries. Was:.** 
1f7c0 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
1f7d0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1f7e0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f7f0 6f 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65  oth be aggregate
1f800 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1f810 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74  We no longer att
1f820 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20  empt to flatten 
1f830 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
1f840 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20  ries. Was:.**   
1f850 20 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20       (2) If the 
1f860 73 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61  subquery is an a
1f870 67 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a  ggregate then.**
1f880 20 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65          (2a) the
1f890 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1f8a0 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  t not be a join 
1f8b0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  and.**        (2
1f8c0 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1f8d0 72 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20  ry must not use 
1f8e0 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
1f8f0 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
1f900 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f  than the one FRO
1f910 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1f920 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64  y that is a cand
1f930 69 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  idate.**        
1f940 20 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e       for flatten
1f950 69 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64  ing.  (This is d
1f960 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66  ue to ticket [2f
1f970 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d  7170d73bf9abf80]
1f980 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f990 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1f9a0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49  ).**.**   (3)  I
1f9b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f9c0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1f9d0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1f9e0 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  IN then.**      
1f9f0 20 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75    (3a) the subqu
1fa00 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1fa10 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20   join and.**    
1fa20 20 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f      (3b) the FRO
1fa30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fa40 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1fa50 20 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75   contain a virtu
1fa60 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
1fa70 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20    table and.**  
1fa80 20 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f        (3c) the o
1fa90 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1faa0 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1fab0 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  te..**.**   (4) 
1fac0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1fad0 6e 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43  n not be DISTINC
1fae0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1faf0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1fb00 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1fb10 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1fb20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1fb30 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1fb40 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1fb50 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1fb60 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1fb70 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1fb80 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1fb90 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1fba0 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1fbb0 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1fbc0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1fbd0 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1fbe0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1fbf0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1fc00 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
1fc10 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66  as:.**        If
1fc20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1fc30 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20   aggregate, the 
1fc40 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fc50 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e  not be DISTINCT.
1fc60 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1fc70 65 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20  e subquery must 
1fc80 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
1fc90 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1fca0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1fcb0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1fcc0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1fcd0 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1fce0 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1fcf0 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1fd00 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1fd10 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1fd20 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1fd30 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1fd40 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1fd50 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1fd60 20 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62   (8)  If the sub
1fd70 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fd80 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fd90 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fda0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
1fdb0 20 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62   (9)  If the sub
1fdc0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fdd0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fde0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fdf0 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
1fe00 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63  *  (**)  Restric
1fe10 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65  tion (10) was re
1fe20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63  moved from the c
1fe30 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30  ode on 2005-02-0
1fe40 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20  5 but we.**     
1fe50 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61     accidently ca
1fe60 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e  rried the commen
1fe70 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20  t forward until 
1fe80 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69  2014-09-15.  Ori
1fe90 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
1fea0 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20  constraint: "If 
1feb0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1fec0 61 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74  aggregate then t
1fed0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a  he outer query .
1fee0 2a 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f  **        may no
1fef0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1ff00 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1ff10 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1ff20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1ff30 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
1ff40 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
1ff50 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
1ff60 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
1ff70 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
1ff80 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
1ff90 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
1ffa0 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
1ffb0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
1ffc0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
1ffd0 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
1ffe0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
1fff0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
20000 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68  ery may not both
20010 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
20020 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
20030 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73  query may not us
20040 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
20050 20 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75   (15)  If the ou
20060 74 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72  ter query is par
20070 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
20080 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65  select, then the
20090 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
200a0 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20  ery may not use 
200b0 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20  LIMIT..**       
200c0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
200d0 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
200e0 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
200f0 2a 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65  **  (16)  If the
20100 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
20110 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20  aggregate, then 
20120 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
20130 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
20140 73 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  se ORDER BY.  (T
20150 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
20160 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
20170 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
20180 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
20190 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
201a0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
201b0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
201c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
201d0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
201e0 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  lect, then.**   
201f0 20 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63       (17a) all c
20200 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
20210 73 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  s must be a UNIO
20220 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20  N ALL, and.**   
20230 20 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65       (17b) no te
20240 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  rms within the s
20250 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64  ubquery compound
20260 20 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74   may be aggregat
20270 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20280 20 20 6f 72 20 44 49 53 54 49 4e 43 54 2c 20 61    or DISTINCT, a
20290 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  nd.**        (17
202a0 63 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69  c) every term wi
202b0 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
202c0 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20  y compound must 
202d0 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
202e0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  se.**        (17
202f0 64 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  d) the outer que
20300 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  ry may not be.**
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
20320 37 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20  7d1) aggregate, 
20330 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
20340 20 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e     (17d2) DISTIN
20350 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  CT, or.**       
20360 20 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20         (17d3) a 
20370 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  join..**.**     
20380 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
20390 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
203a0 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
203b0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
203c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
203d0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
203e0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
203f0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
20400 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
20410 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
20420 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
20430 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
20440 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
20450 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
20460 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
20470 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
20480 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
20490 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
204a0 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
204b0 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
204c0 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
204d0 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
204e0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
204f0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
20500 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
20510 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
20520 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
20530 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
20540 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
20550 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
20560 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
20570 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
20580 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
20590 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
205a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
205b0 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
205c0 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
205d0 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
205e0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
205f0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
20600 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
20610 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
20620 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
20630 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
20640 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
20650 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
20660 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
20670 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
20680 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
20690 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
206a0 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
206b0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c       ORDER BY cl
206c0 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
206d0 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
206e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
206f0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
20700 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
20710 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
20720 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
20730 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
20740 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20750 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20760 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
20770 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
20780 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
20790 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
207a0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
207b0 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
207c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
207d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
207e0 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
207f0 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
20800 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
20810 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
20820 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
20830 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
20840 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20850 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
20860 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
20870 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
20880 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
20890 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65  r query.  But we
208a0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
208b0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
208c0 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
208d0 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
208e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
208f0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20900 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
20910 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20920 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20   may not be.**  
20930 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
20940 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
20950 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
20960 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
20970 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20980 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
20990 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53  ..**.**  (**)  S
209a0 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
209b0 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 2e  triction (17d3).
209c0 20 20 57 61 73 3a 20 49 66 20 74 68 65 20 6f 75    Was: If the ou
209d0 74 65 72 20 71 75 65 72 79 20 69 73 0a 2a 2a 20  ter query is.** 
209e0 20 20 20 20 20 20 20 61 20 72 65 63 75 72 73 69         a recursi
209f0 76 65 20 43 54 45 2c 20 74 68 65 6e 20 74 68 65  ve CTE, then the
20a00 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 6e   sub-query may n
20a10 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  ot be a compound
20a20 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20   query..**      
20a30 20 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69    This restricti
20a40 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
20a50 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
20a60 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
20a70 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
20a80 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
20a90 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
20aa0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
20ab0 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
20ac0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
20ad0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
20ae0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
20af0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
20b00 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
20b10 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20  es.  Was:.**    
20b20 20 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79      The subquery
20b30 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61   may not be an a
20b40 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
20b50 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
20b60 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
20b70 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
20b80 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
20b90 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
20ba0 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
20bb0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
20bc0 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
20bd0 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
20be0 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
20bf0 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
20c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
20c10 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
20c20 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
20c30 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32 35 29 20  l.).**.**  (25) 
20c40 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 73   If either the s
20c50 75 62 71 75 65 72 79 20 6f 72 20 74 68 65 20 70  ubquery or the p
20c60 61 72 65 6e 74 20 71 75 65 72 79 20 63 6f 6e 74  arent query cont
20c70 61 69 6e 73 20 61 20 77 69 6e 64 6f 77 0a 2a 2a  ains a window.**
20c80 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
20c90 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c   in the select l
20ca0 69 73 74 20 6f 72 20 4f 52 44 45 52 20 42 59 20  ist or ORDER BY 
20cb0 63 6c 61 75 73 65 2c 20 66 6c 61 74 74 65 6e 69  clause, flatteni
20cc0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20  ng.**        is 
20cd0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a  not attempted..*
20ce0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
20cf0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
20d00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
20d10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
20d20 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
20d30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
20d40 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
20d50 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
20d60 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
20d70 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
20d80 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
20d90 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
20da0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
20db0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20dc0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
20dd0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
20de0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
20df0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
20e00 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
20e10 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
20e20 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
20e30 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
20e40 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
20e50 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
20e60 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
20e70 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
20e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20e90 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
20ea0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20eb0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
20ec0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
20ed0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
20ee0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
20ef0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
20f00 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
20f10 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
20f20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
20f30 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
20f40 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
20f50 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
20f60 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
20f70 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
20f80 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
20f90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
20fa0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
20fb0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
20fc0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
20fd0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
20fe0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
20ff0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
21000 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
21010 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
21020 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
21030 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
21040 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
21050 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
21060 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
21070 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21080 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
21090 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
210a0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
210b0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
210c0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
210d0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
210e0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
210f0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
21100 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
21110 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
21120 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
21130 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
21140 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
21150 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
21160 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
21170 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
21180 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
21190 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
211a0 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
211b0 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
211c0 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
211d0 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
211e0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
211f0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
21200 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
21210 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21220 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
21230 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
21240 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
21250 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
21260 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21270 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
21280 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
212a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
212b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
212c0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
212d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
212e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
212f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21300 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
21310 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
21320 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
21330 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
21340 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
21350 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
21360 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
21370 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
21380 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
21390 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
213a0 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
213b0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
213c0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
213d0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
213e0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
213f0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
21400 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
21410 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =0 );..#ifndef S
21420 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
21430 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70  WFUNC.  if( p->p
21440 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e 70 57 69  Win || pSub->pWi
21450 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21470 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
21480 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  5) */.#endif..  
21490 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
214a0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
214b0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
214c0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
214d0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
214e0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
214f0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
21500 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
21510 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
21520 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
21530 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
21540 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
21550 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
21560 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
21570 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
21580 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
21590 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
215a0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
215b0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
215c0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
215d0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
215e0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
215f0 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
21600 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
21610 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
21620 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21640 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
21650 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21660 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
21670 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20  >pLimit->pRight 
21680 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
21690 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
216a0 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
216b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
216c0 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
216d0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
216e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21720 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
21730 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
21740 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
21750 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21770 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
21780 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
21790 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
217a0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
217b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
217c0 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f  triction (4)  */
217d0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
217e0 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
217f0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
21800 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21820 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
21830 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
21840 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
21850 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
21860 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
218a0 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
218b0 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
218c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
218d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
218e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
218f0 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
21900 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21910 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
21920 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
21930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21940 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
21950 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21960 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
21970 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
21980 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
21990 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
219a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
219b0 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
219c0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
219d0 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
219e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
219f0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
21a00 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a  ns (22) */.  }..
21a10 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
21a20 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21a30 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21a40 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21a50 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  hen the.  ** sub
21a60 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
21a70 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28   a join itself (
21a80 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20  3a). Example of 
21a90 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a  why this is not.
21aa0 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20    ** allowed:.  
21ab0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21ac0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
21ad0 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
21ae0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
21af0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
21b00 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
21b10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21b20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
21b30 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
21b40 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
21b50 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
21b60 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
21b70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
21b80 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21b90 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21ba0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21bb0 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20  hen the outer.  
21bc0 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  ** query cannot 
21bd0 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
21be0 20 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61   (3c)  This is a
21bf0 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68  n artifact of th
21c00 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65  e way.  ** aggre
21c10 67 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73  gates are proces
21c20 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e  sed - there is n
21c30 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64  o mechanism to d
21c40 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a  etermine if.  **
21c50 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74   the LEFT JOIN t
21c60 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61  able should be a
21c70 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  ll-NULL..  **.  
21c80 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b  ** See also tick
21c90 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20  ets #306, #350, 
21ca0 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a  and #3300..  */.
21cb0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
21cc0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
21cd0 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
21ce0 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
21cf0 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53  1;.    if( pSubS
21d00 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
21d10 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  Agg || IsVirtual
21d20 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70  (pSubSrc->a[0].p
21d30 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
21d40 20 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20    (3a)          
21d50 20 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29     (3c)     (3b)
21d60 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
21d70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   0;.    }.  }.#i
21d80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
21d90 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c  A_IFNULLROW.  el
21da0 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  se if( iFrom>0 &
21db0 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
21dc0 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66  /* Setting isLef
21dd0 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73  tJoin to -1 caus
21de0 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  es OP_IfNullRow 
21df0 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65  opcodes to be ge
21e00 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20  nerated for.    
21e10 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ** every referen
21e20 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74  ce to any result
21e30 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62   column from sub
21e40 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c  query in a join,
21e50 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f   even.    ** tho
21e60 75 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74  ugh they are not
21e70 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
21e80 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65  s will stress-te
21e90 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c  st the OP_IfNull
21ea0 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f  Row .    ** opco
21eb0 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66  de. */.    isLef
21ec0 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tJoin = -1;.  }.
21ed0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73  #endif..  /* Res
21ee0 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49  triction (17): I
21ef0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
21f00 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
21f10 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
21f20 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
21f30 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
21f40 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
21f50 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
21f60 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
21f70 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
21f80 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
21f90 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
21fa0 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
21fb0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
21fc0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
21fd0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
21fe0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
21ff0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
22000 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22010 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
22020 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  (20) */.    }.  
22030 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
22040 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22050 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
22060 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
22070 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
22080 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37  ; /* (17d1), (17
22090 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a  d2), or (17d3) *
220a0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  /.    }.    for(
220b0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
220c0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
220d0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
220e0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
220f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22100 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
22110 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
22120 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
22130 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
22140 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22150 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22160 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
22170 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
22180 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
22190 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
221a0 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
221b0 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
221c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
221d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
221e0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
221f0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22200 67 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20  ggregate))!=0   
22210 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20   /* (17b) */.   
22220 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
22230 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
22240 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20  op!=TK_ALL)     
22250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22260 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c  17a) */.       |
22270 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
22280 53 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20  Src<1           
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20         /* (17c) 
222b0 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  */.      ){.    
222c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
222d0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
222e0 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
222f0 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
22300 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
22310 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a  iction (18). */.
22320 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
22330 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
22340 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
22350 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
22360 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
22370 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22380 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
22390 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
223a0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
223b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
223c0 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74   }..  /* Ex-rest
223d0 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20  riction (23):.  
223e0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** The only way 
223f0 74 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69  that the recursi
22400 76 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45  ve part of a CTE
22410 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63   can contain a c
22420 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62  ompound.  ** sub
22430 71 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65  query is for the
22440 20 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20   subquery to be 
22450 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f  one term of a jo
22460 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a  in.  But if the.
22470 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
22480 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
22490 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73  e flattening has
224a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
224b0 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65  opped by.  ** re
224c0 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29  striction (17d3)
224d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
224e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
224f0 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
22500 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  || pSub->pPrior=
22510 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  =0 );..  /***** 
22520 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22530 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
22540 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
22550 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
22560 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
22570 2c 28 22 66 6c 61 74 74 65 6e 20 25 75 2e 25 70  ,("flatten %u.%p
22580 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
22590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
225a0 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 49 64       pSub->selId
225b0 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
225c0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
225d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
225e0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
225f0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
22600 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
22610 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
22620 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22630 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
22640 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
22650 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
22660 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
22670 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
22680 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
22690 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
226a0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
226b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
226c0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
226d0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
226e0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
226f0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
22700 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
22710 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
22720 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
22730 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
22740 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22750 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
22760 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
22770 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
22780 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
22790 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
227a0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
227b0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
227c0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
227d0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
227e0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
227f0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
22800 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
22810 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
22820 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
22830 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
22840 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
22850 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
22860 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
22870 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
22880 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
22890 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
228a0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
228b0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
228c0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
228d0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
228e0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
228f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22900 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
22910 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
22920 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
22930 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
22940 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
22950 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
22960 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22970 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22980 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
22990 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
229a0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
229b0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
229c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
229d0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
229e0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
229f0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
22a00 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
22a10 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22a20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
22a30 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
22a40 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
22a50 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
22a60 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
22a70 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
22a80 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
22a90 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
22aa0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
22ab0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
22ac0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
22ad0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
22ae0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
22af0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
22b00 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
22b10 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
22b20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
22b30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
22b40 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
22b50 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
22b60 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
22b70 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
22b80 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
22b90 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22ba0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
22bb0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
22bc0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
22bd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
22be0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22bf0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
22c00 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d   0);.    p->pLim
22c10 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
22c20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
22c30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
22c40 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
22c50 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
22c60 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
22c70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   ){.      p->pPr
22c80 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
22c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22ca0 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
22cb0 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
22cc0 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
22cd0 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22ce0 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74       pNew->pNext
22cf0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = p;.      p->p
22d00 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
22d10 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
22d20 32 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d  2,pParse,p,("com
22d30 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
22d40 6c 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20 20  lattener".      
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 20 20 20 22 20 63 72 65 61 74 65          " create
22d70 73 20 25 75 20 61 73 20 70 65 65 72 5c 6e 22 2c  s %u as peer\n",
22d80 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pNew->selId));. 
22d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
22da0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
22db0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
22dc0 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
22dd0 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
22de0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
22df0 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
22e00 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
22e10 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
22e20 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
22e30 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
22e40 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
22e50 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
22e60 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
22e70 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
22e80 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
22e90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22ea0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
22eb0 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
22ec0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22ed0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
22ee0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22ef0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
22f00 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
22f10 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
22f20 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
22f30 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
22f40 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
22f50 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
22f60 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
22f70 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
22f80 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
22f90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22fa0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
22fb0 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
22fc0 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
22fd0 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
22fe0 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
22ff0 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
23000 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
23010 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
23020 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
23030 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
23040 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
23050 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
23060 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
23070 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
23080 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
23090 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
230a0 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
230b0 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
230c0 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
230d0 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
230e0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
230f0 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
23100 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a  ->nTabRef==1 ){.
23110 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f        Parse *pTo
23120 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
23130 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
23140 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61  arse);.      pTa
23150 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
23160 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  bie = pToplevel-
23170 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20  >pZombieTab;.   
23180 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a     pToplevel->pZ
23190 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
231a0 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
231b0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
231c0 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20  ->nTabRef--;.   
231d0 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
231e0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
231f0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
23200 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
23210 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
23220 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
23230 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
23240 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
23250 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
23260 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
23270 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
23280 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
23290 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
232a0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
232b0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
232c0 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
232d0 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
232e0 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
232f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
23300 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
23310 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
23320 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
23330 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
23340 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
23350 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
23360 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
23370 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
23380 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
23390 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
233a0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
233b0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
233c0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
233d0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
233e0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
233f0 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
23400 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
23410 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
23420 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
23430 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
23440 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
23450 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
23460 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
23470 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
23480 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
23490 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
234a0 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
234b0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
234c0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
234d0 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
234e0 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
234f0 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
23500 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
23510 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
23520 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
23530 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
23540 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
23550 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
23560 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
23570 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
23580 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
23590 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
235a0 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
235b0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
235c0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
235d0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
235e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
235f0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
23600 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
23610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23620 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
23630 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
23640 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
23650 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
23660 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
23670 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
23680 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23690 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
236a0 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
236b0 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
236c0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
236d0 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
236e0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
236f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
23700 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
23710 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
23720 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
23730 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
23740 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
23750 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23760 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
23770 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
23780 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
23790 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
237a0 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
237b0 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
237c0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
237d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
237e0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
237f0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
23800 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
23810 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
23820 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
23830 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
23840 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
23850 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
23860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
23870 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
23880 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
23890 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
238a0 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
238b0 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
238c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
238d0 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
238e0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
238f0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
23900 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
23910 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
23920 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
23930 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
23940 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
23950 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
23960 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
23970 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
23980 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
23990 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20   to 4 slots..   
239a0 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73   ** The middle s
239b0 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
239c0 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
239d0 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
239e0 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ace.    ** for t
239f0 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  he two elements 
23a00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23a10 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
23a20 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
23a30 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
23a40 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
23a50 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
23a60 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
23a70 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
23a80 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
23a90 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
23aa0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
23ab0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23ac0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23ad0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
23ae0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
23af0 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
23b00 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
23b10 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
23b20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
23b30 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
23b40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
23b50 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
23b60 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
23b70 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
23b80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
23b90 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67  c->a[i+iFrom].fg
23ba0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
23bb0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
23bc0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
23bd0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
23be0 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62  NewParent = pSub
23bf0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
23c00 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  r;.      memset(
23c10 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
23c20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
23c30 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
23c40 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
23c50 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om].fg.jointype 
23c60 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
23c70 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
23c80 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
23c90 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
23ca0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
23cb0 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
23cc0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
23cd0 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
23ce0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
23cf0 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
23d00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
23d10 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
23d20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
23d30 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
23d40 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
23d50 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
23d80 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
23d90 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
23da0 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
23db0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23dc0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
23dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
23df0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
23e00 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
23e10 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
23e20 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
23e30 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
23e40 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
23e50 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
23e60 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
23e70 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
23e80 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
23e90 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  0"..    */.    i
23ea0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
23eb0 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
23ec0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
23ed0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
23ee0 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
23ef0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
23f00 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
23f10 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
23f20 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
23f30 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
23f40 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
23f50 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
23f60 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
23f70 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
23f80 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
23f90 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
23fa0 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
23fb0 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
23fc0 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
23fd0 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
23fe0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
23ff0 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
24000 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
24010 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
24020 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
24030 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
24040 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
24050 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
24060 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
24070 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
24080 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
24090 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
240a0 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
240b0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
240c0 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
240d0 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
240e0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
240f0 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
24100 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
24110 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
24120 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
24130 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
24140 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
24150 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
24160 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
24170 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
24180 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
24190 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
241a0 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
241b0 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
241c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
241d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
241e0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
241f0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
24200 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
24210 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
24220 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  erBy = 0;.    }.
24230 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
24240 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
24250 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
24260 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74  ;.    if( isLeft
24270 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  Join>0 ){.      
24280 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65  setJoinExpr(pWhe
24290 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b  re, iNewParent);
242a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 65  .    }.    pPare
242b0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
242c0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
242d0 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d  pWhere, pParent-
242e0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66  >pWhere);.    if
242f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24300 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
24310 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
24320 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20       x.pParse = 
24330 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e  pParse;.      x.
24340 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74  iTable = iParent
24350 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61  ;.      x.iNewTa
24360 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74  ble = iNewParent
24370 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
24380 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69  Join = isLeftJoi
24390 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  n;.      x.pELis
243a0 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  t = pSub->pEList
243b0 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  ;.      substSel
243c0 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c  ect(&x, pParent,
243d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
243e0 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
243f0 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
24400 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
24410 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
24420 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
24430 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
24440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
24450 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
24460 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
24470 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
24480 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
24490 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
244a0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
244b0 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
244c0 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
244d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
244e0 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
244f0 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
24500 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
24510 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
24520 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
24530 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
24540 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
24550 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
24560 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
24570 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
24580 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
24590 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
245a0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
245b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
245c0 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
245d0 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
245e0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
245f0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
24600 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
24610 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24620 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
24630 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
24640 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
24650 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
24660 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
24670 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
24680 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
24690 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a  fter flattening:
246a0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
246b0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
246c0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
246d0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
246e0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
246f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
24700 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
24710 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
24720 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
24730 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
24740 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20  e to keep track 
24750 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  of all of the co
24760 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74 68 61 74  lumn values that
24770 20 66 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20 6b   fixed to.** a k
24780 6e 6f 77 6e 20 76 61 6c 75 65 20 64 75 65 20 74  nown value due t
24790 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
247a0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
247b0 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41  e form COLUMN=VA
247c0 4c 55 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  LUE..*/.typedef 
247d0 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73  struct WhereCons
247e0 74 20 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73 74  t WhereConst;.st
247f0 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20  ruct WhereConst 
24800 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24810 65 3b 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e;   /* Parsing 
24820 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
24830 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f 2a   nConst;      /*
24840 20 4e 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c 55   Number for COLU
24850 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72 6d  MN=CONSTANT term
24860 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67  s */.  int nChng
24870 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
24880 72 20 6f 66 20 74 69 6d 65 73 20 61 20 63 6f 6e  r of times a con
24890 73 74 61 6e 74 20 69 73 20 70 72 6f 70 61 67 61  stant is propaga
248a0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ted */.  Expr **
248b0 61 70 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69 2a  apExpr;   /* [i*
248c0 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e 64  2] is COLUMN and
248d0 20 5b 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c 55   [i*2+1] is VALU
248e0 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  E */.};../*.** A
248f0 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74  dd a new entry t
24900 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 6f 62 6a  o the pConst obj
24910 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
24920 69 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 0a  id constInsert(.
24930 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43    WhereConst *pC
24940 6f 6e 73 74 2c 0a 20 20 45 78 70 72 20 2a 70 43  onst,.  Expr *pC
24950 6f 6c 75 6d 6e 2c 0a 20 20 45 78 70 72 20 2a 70  olumn,.  Expr *p
24960 56 61 6c 75 65 0a 29 7b 0a 0a 20 20 70 43 6f 6e  Value.){..  pCon
24970 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a 20 20  st->nConst++;.  
24980 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 20 3d  pConst->apExpr =
24990 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
249a0 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74 2d 3e  cOrFree(pConst->
249b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6e  pParse->db, pCon
249c0 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20 20 20  st->apExpr,.    
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f       pConst->nCo
249f0 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45 78 70  nst*2*sizeof(Exp
24a00 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e  r*));.  if( pCon
24a10 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20 29 7b  st->apExpr==0 ){
24a20 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f  .    pConst->nCo
24a30 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nst = 0;.  }else
24a40 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
24a50 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c 75 65  sProperty(pValue
24a60 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
24a70 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c 75 65   pValue = pValue
24a80 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70 43 6f  ->pLeft;.    pCo
24a90 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e  nst->apExpr[pCon
24aa0 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d 20  st->nConst*2-2] 
24ab0 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  = pColumn;.    p
24ac0 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43  Const->apExpr[pC
24ad0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 31  onst->nConst*2-1
24ae0 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d 0a  ] = pValue;.  }.
24af0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6c  }../*.** Find al
24b00 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c 55 4d  l terms of COLUM
24b10 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c 55 45  N=VALUE or VALUE
24b20 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70 72  =COLUMN in pExpr
24b30 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a 2a 20   where VALUE.** 
24b40 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
24b50 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77 68 65  pression and whe
24b60 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75 73 74  re the term must
24b70 20 62 65 20 74 72 75 65 20 62 65 63 61 75 73 65   be true because
24b80 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f   it.** is part o
24b90 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65 63  f the AND-connec
24ba0 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ted terms of the
24bb0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 46 6f   expression.  Fo
24bc0 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a 20 66  r each term.** f
24bd0 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74 6f 20  ound, add it to 
24be0 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72 75 63  the pConst struc
24bf0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
24c00 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74 49 6e  void findConstIn
24c10 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e 73 74  Where(WhereConst
24c20 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72 20 2a   *pConst, Expr *
24c30 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
24c40 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
24c50 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
24c60 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 45   return;.  if( E
24c70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24c80 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
24c90 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  n) ) return;.  i
24ca0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
24cb0 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66 69 6e 64  _AND ){.    find
24cc0 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f  ConstInWhere(pCo
24cd0 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  nst, pExpr->pRig
24ce0 68 74 29 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e  ht);.    findCon
24cf0 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74  stInWhere(pConst
24d00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
24d10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
24d20 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
24d30 21 3d 54 4b 5f 45 51 20 29 20 72 65 74 75 72 6e  !=TK_EQ ) return
24d40 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 45 78  ;.  pRight = pEx
24d50 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 70 4c  pr->pRight;.  pL
24d60 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
24d70 66 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ft;.  assert( pR
24d80 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  ight!=0 );.  ass
24d90 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
24da0 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f  .  if( pRight->o
24db0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
24dc0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
24dd0 72 74 79 28 70 52 69 67 68 74 2c 20 45 50 5f 46  rty(pRight, EP_F
24de0 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73  ixedCol).   && s
24df0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
24e00 74 61 6e 74 28 70 4c 65 66 74 29 0a 20 20 20 26  tant(pLeft).   &
24e10 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  & sqlite3IsBinar
24e20 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  y(sqlite3BinaryC
24e30 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 43  ompareCollSeq(pC
24e40 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65  onst->pParse,pLe
24e50 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29 7b  ft,pRight)).  ){
24e60 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72 74  .    constInsert
24e70 28 70 43 6f 6e 73 74 2c 20 70 52 69 67 68 74 2c  (pConst, pRight,
24e80 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65   pLeft);.  }else
24e90 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
24ea0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
24eb0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
24ec0 74 79 28 70 4c 65 66 74 2c 20 45 50 5f 46 69 78  ty(pLeft, EP_Fix
24ed0 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c  edCol).   && sql
24ee0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
24ef0 6e 74 28 70 52 69 67 68 74 29 0a 20 20 20 26 26  nt(pRight).   &&
24f00 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79   sqlite3IsBinary
24f10 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  (sqlite3BinaryCo
24f20 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 43 6f  mpareCollSeq(pCo
24f30 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65 66  nst->pParse,pLef
24f40 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29 7b 0a  t,pRight)).  ){.
24f50 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72 74 28      constInsert(
24f60 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74 2c 20 70  pConst, pLeft, p
24f70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Right);.  }.}../
24f80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
24f90 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69 6f 6e  alker expression
24fa0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45 78 70   callback.  pExp
24fb0 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
24fc0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
24fd0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  o be replaced by
24fe0 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20 70 45   a value.  If pE
24ff0 78 70 72 20 69 73 20 65 71 75 69 76 61 6c 65 6e  xpr is equivalen
25000 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 0a  t to one of the.
25010 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64  ** columns named
25020 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70   in pWalker->u.p
25030 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76 65 72  Const, then over
25040 77 72 69 74 65 20 69 74 20 77 69 74 68 20 69 74  write it with it
25050 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  s.** correspondi
25060 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ng value..*/.sta
25070 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74  tic int propagat
25080 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65 77  eConstantExprRew
25090 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  rite(Walker *pWa
250a0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
250b0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  r){.  int i;.  W
250c0 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73  hereConst *pCons
250d0 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
250e0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
250f0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
25100 6e 75 65 3b 0a 20 20 69 66 28 20 45 78 70 72 48  nue;.  if( ExprH
25110 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
25120 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
25130 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
25140 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74 20 3d  inue;.  pConst =
25150 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e   pWalker->u.pCon
25160 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
25170 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b  <pConst->nConst;
25180 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
25190 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f 6e 73  *pColumn = pCons
251a0 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a  t->apExpr[i*2];.
251b0 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d      if( pColumn=
251c0 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  =pExpr ) continu
251d0 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75  e;.    if( pColu
251e0 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45 78 70  mn->iTable!=pExp
251f0 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f 6e 74  r->iTable ) cont
25200 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
25210 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  olumn->iColumn!=
25220 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
25230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f   continue;.    /
25240 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66 6f 75  * A match is fou
25250 6e 64 2e 20 20 41 64 64 20 74 68 65 20 45 50 5f  nd.  Add the EP_
25260 46 69 78 65 64 43 6f 6c 20 70 72 6f 70 65 72 74  FixedCol propert
25270 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74 2d  y */.    pConst-
25280 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 45 78  >nChng++;.    Ex
25290 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
252a0 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66 29 3b  pExpr, EP_Leaf);
252b0 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
252c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
252d0 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20 20 61 73  ixedCol);.    as
252e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
252f0 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78  ft==0 );.    pEx
25300 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
25310 74 65 33 45 78 70 72 44 75 70 28 70 43 6f 6e 73  te3ExprDup(pCons
25320 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  t->pParse->db, p
25330 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a  Const->apExpr[i*
25340 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 62 72  2+1], 0);.    br
25350 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
25360 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
25370 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 2d  /*.** The WHERE-
25380 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74 20  clause constant 
25390 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
253a0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
253b0 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
253c0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72  use contains ter
253d0 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43  ms of the form C
253e0 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f  OLUMN=CONSTANT o
253f0 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d 43 4f  r.** CONSTANT=CO
25400 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74 20 62  LUMN that must b
25410 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68 65 72  e tree (in other
25420 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
25430 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a  erms top-level.*
25440 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  * AND-connected 
25450 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 6e  terms that are n
25460 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f 4e 20  ot part of a ON 
25470 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 4c 45  clause from a LE
25480 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68 65 6e  FT JOIN).** then
25490 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   throughout the 
254a0 71 75 65 72 79 20 72 65 70 6c 61 63 65 20 61 6c  query replace al
254b0 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65 6e  l other occurren
254c0 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a 2a 2a  ces of COLUMN.**
254d0 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54 20 77   with CONSTANT w
254e0 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45 20  ithin the WHERE 
254f0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  clause..**.** Fo
25500 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
25510 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
25520 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
25530 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
25540 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e 62  t1.a=39 AND t2.b
25550 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e 63 3d 74  =t1.a AND t3.c=t
25560 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74 72 61  2.b.**.** Is tra
25570 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a  nsformed into.**
25580 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20  .**      SELECT 
25590 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
255a0 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39 20  3 WHERE t1.a=39 
255b0 41 4e 44 20 74 32 2e 62 3d 33 39 20 41 4e 44 20  AND t2.b=39 AND 
255c0 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20 52 65  t3.c=39.**.** Re
255d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
255e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73   transformations
255f0 20 77 68 65 72 65 20 6d 61 64 65 20 61 6e 64 20   where made and 
25600 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
25610 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
25620 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e 73 74 61  on note:  Consta
25630 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 69  nt propagation i
25640 73 20 74 72 69 63 6b 79 20 64 75 65 20 74 6f 20  s tricky due to 
25650 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 6e 64 20  affinity.** and 
25660 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
25670 63 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 2e  ce interactions.
25680 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
25690 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
256a0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
256b0 31 28 61 20 49 4e 54 2c 62 20 54 45 58 54 29 3b  1(a INT,b TEXT);
256c0 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .**    INSERT IN
256d0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 32 33  TO t1 VALUES(123
256e0 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20 20 20 20  ,'0123');.**    
256f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25700 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44   WHERE a=123 AND
25710 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53 45 4c 45   b=a;.**    SELE
25720 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
25730 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d 31  RE a=123 AND b=1
25740 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 77  23;.**.** The tw
25750 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  o SELECT stateme
25760 6e 74 73 20 61 62 6f 76 65 20 73 68 6f 75 6c 64  nts above should
25770 20 72 65 74 75 72 6e 20 64 69 66 66 65 72 65 6e   return differen
25780 74 20 61 6e 73 77 65 72 73 2e 20 20 62 3d 61 0a  t answers.  b=a.
25790 2a 2a 20 69 73 20 61 6c 77 61 79 20 74 72 75 65  ** is alway true
257a0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6d   because the com
257b0 70 61 72 69 73 6f 6e 20 75 73 65 73 20 6e 75 6d  parison uses num
257c0 65 72 69 63 20 61 66 66 69 6e 69 74 79 2c 20 62  eric affinity, b
257d0 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69 73 20 66  ut b=123.** is f
257e0 61 6c 73 65 20 62 65 63 61 75 73 65 20 69 74 20  alse because it 
257f0 75 73 65 73 20 74 65 78 74 20 61 66 66 69 6e 69  uses text affini
25800 74 79 20 61 6e 64 20 27 30 31 32 33 27 20 69 73  ty and '0123' is
25810 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
25820 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f 20 77 6f   '123'..** To wo
25830 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
25840 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
25850 72 65 65 20 69 73 20 6e 6f 74 20 61 63 74 75 61  ree is not actua
25860 6c 6c 79 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  lly changed from
25870 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20 22 62 3d  .** "b=a" to "b=
25880 31 32 33 22 20 62 75 74 20 72 61 74 68 65 72 20  123" but rather 
25890 74 68 65 20 22 61 22 20 69 6e 20 22 62 3d 61 22  the "a" in "b=a"
258a0 20 69 73 20 74 61 67 67 65 64 20 77 69 74 68 20   is tagged with 
258b0 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a 20 61  EP_FixedCol.** a
258c0 6e 64 20 74 68 65 20 22 31 32 33 22 20 76 61 6c  nd the "123" val
258d0 75 65 20 69 73 20 68 75 6e 67 20 6f 66 66 20 6f  ue is hung off o
258e0 66 20 74 68 65 20 70 4c 65 66 74 20 70 6f 69 6e  f the pLeft poin
258f0 74 65 72 2e 20 20 43 6f 64 65 20 67 65 6e 65 72  ter.  Code gener
25900 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  ator.** routines
25910 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65 72 61 74   know to generat
25920 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  e the constant "
25930 31 32 33 22 20 69 6e 73 74 65 61 64 20 6f 66 20  123" instead of 
25940 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 0a 2a  looking up the.*
25950 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 20  * column value. 
25960 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f 69 64 20   Also, to avoid 
25970 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f 62 6c 65  collation proble
25980 6d 73 2c 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ms, this optimiz
25990 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e 6c 79  ation is.** only
259a0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 74 68   attempted if th
259b0 65 20 22 61 3d 31 32 33 22 20 74 65 72 6d 20 75  e "a=123" term u
259c0 73 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  ses the default 
259d0 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e  BINARY collation
259e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
259f0 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
25a00 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
25a10 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  rse,   /* The pa
25a20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
25a30 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20 20 20  .  Select *p    
25a40 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
25a50 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 72 6f   in which to pro
25a60 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e 74 73  pagate constants
25a70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6f   */.){.  WhereCo
25a80 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65 72 20  nst x;.  Walker 
25a90 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
25aa0 20 30 3b 0a 20 20 78 2e 70 50 61 72 73 65 20 3d   0;.  x.pParse =
25ab0 20 70 50 61 72 73 65 3b 0a 20 20 64 6f 7b 0a 20   pParse;.  do{. 
25ac0 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20 30 3b     x.nConst = 0;
25ad0 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d 20 30  .    x.nChng = 0
25ae0 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72 20 3d  ;.    x.apExpr =
25af0 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73   0;.    findCons
25b00 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70 2d 3e  tInWhere(&x, p->
25b10 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  pWhere);.    if(
25b20 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20 20 20   x.nConst ){.   
25b30 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c     memset(&w, 0,
25b40 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 20   sizeof(w));.   
25b50 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50     w.pParse = pP
25b60 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e 78 45  arse;.      w.xE
25b70 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 70 72  xprCallback = pr
25b80 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45  opagateConstantE
25b90 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20 20 20  xprRewrite;.    
25ba0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
25bb0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
25bc0 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 20  ectWalkNoop;.   
25bd0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
25be0 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20  back2 = 0;.     
25bf0 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
25c00 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e 70 43   0;.      w.u.pC
25c10 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20 20 20  onst = &x;.     
25c20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
25c30 28 26 77 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (&w, p->pWhere);
25c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
25c50 46 72 65 65 28 78 2e 70 50 61 72 73 65 2d 3e 64  Free(x.pParse->d
25c60 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a 20 20  b, x.apExpr);.  
25c70 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78 2e 6e      nChng += x.n
25c80 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Chng;.    }.  }w
25c90 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20 29 3b  hile( x.nChng );
25ca0 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e    .  return nChn
25cb0 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  g;.}..#if !defin
25cc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
25cd0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
25ce0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
25cf0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
25d00 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
25d10 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
25d20 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
25d30 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
25d40 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
25d50 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
25d60 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
25d70 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25d80 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
25d90 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
25da0 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
25db0 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
25dc0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
25dd0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
25de0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
25df0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
25e00 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
25e10 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
25e20 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
25e30 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
25e40 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
25e50 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
25e60 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
25e70 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
25e80 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
25e90 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
25ea0 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
25eb0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
25ec0 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68  .**   (1) (** Th
25ed0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77  is restriction w
25ee0 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30  as removed on 20
25ef0 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73  17-09-29.  We us
25f00 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
25f10 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73     disallow this
25f20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
25f30 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  r aggregate subq
25f40 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a  ueries, but now.
25f50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74 20  **           it 
25f60 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75  is allowed by pu
25f70 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61 20  tting the extra 
25f80 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56  terms on the HAV
25f90 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  ING clause..**  
25fa0 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64 64           The add
25fb0 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  ed HAVING clause
25fc0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66   is pointless if
25fd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c 61   the subquery la
25fe0 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cks.**          
25ff0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
26000 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61 20  se.  But such a 
26010 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
26020 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a   also harmless.*
26030 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  *           so t
26040 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70  here does not ap
26050 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72  pear to be any r
26060 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74  eason to add ext
26070 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20  ra logic.**     
26080 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65 73        to suppres
26090 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20  s it. **).**.** 
260a0 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
260b0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
260c0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
260d0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
260e0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
260f0 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
26100 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
26110 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
26120 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
26130 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
26140 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64 20 63    clause would c
26150 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e  hange the meanin
26160 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e  g of the LIMIT).
26170 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65  .**.**   (4) The
26180 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
26190 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
261a0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
261b0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20 20   and the.**     
261c0 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20    expression to 
261d0 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 64  be pushed down d
261e0 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f  oes not come fro
261f0 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a  m the ON clause.
26200 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61 74  **       on that
26210 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a   LEFT JOIN..**.*
26220 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52  *   (5) The WHER
26230 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
26240 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69  ion originates i
26250 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
26260 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  G clause.**     
26270 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e    of a LEFT JOIN
26280 20 77 68 65 72 65 20 69 43 75 72 73 6f 72 20 69   where iCursor i
26290 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
262a0 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74 68  hand table of th
262b0 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66 74  at.**       left
262c0 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70   join.  An examp
262d0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
262e0 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20      SELECT *.** 
262f0 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28            FROM (
26300 53 45 4c 45 43 54 20 31 20 41 53 20 61 31 20 55  SELECT 1 AS a1 U
26310 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
26320 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20 20  2) AS aa.**     
26330 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45        JOIN (SELE
26340 43 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f 4e  CT 1 AS b2 UNION
26350 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41   ALL SELECT 2) A
26360 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a  S bb ON (a1=b2).
26370 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45 46  **           LEF
26380 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 38  T JOIN (SELECT 8
26390 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c   AS c3 UNION ALL
263a0 20 53 45 4c 45 43 54 20 39 29 20 41 53 20 63 63   SELECT 9) AS cc
263b0 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a   ON (b2=2);.**.*
263c0 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f 72 72  *       The corr
263d0 65 63 74 20 61 6e 73 77 65 72 20 69 73 20 74 68  ect answer is th
263e0 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c  ree rows:  (1,1,
263f0 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32  NULL),(2,2,8),(2
26400 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20  ,2,9)..**       
26410 42 75 74 20 69 66 20 74 68 65 20 28 62 32 3d 32  But if the (b2=2
26420 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20 62  ) term were to b
26430 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69 6e  e pushed down in
26440 74 6f 20 74 68 65 20 62 62 20 73 75 62 71 75 65  to the bb subque
26450 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65  ry,.**       the
26460 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29  n the (1,1,NULL)
26470 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73 75   row would be su
26480 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ppressed..**.** 
26490 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65 72 20    (6) The inner 
264a0 71 75 65 72 79 20 66 65 61 74 75 72 65 73 20 6f  query features o
264b0 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f  ne or more windo
264c0 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73 69 6e  w-functions (sin
264d0 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63 68 61  ce .**       cha
264e0 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
264f0 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
26500 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f 75 6c  inner query coul
26510 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a 2a 2a  d change the .**
26520 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20 6f 76         window ov
26530 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f 77 20  er which window 
26540 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 63 61  functions are ca
26550 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a 2a 2a  lculated)..**.**
26560 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
26570 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
26580 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
26590 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
265a0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
265b0 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
265c0 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
265d0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
265e0 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
265f0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
26600 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
26610 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
26620 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
26630 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
26640 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
26650 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
26660 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
26670 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
26680 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
26690 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
266a0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
266b0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
266c0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
266d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
266e0 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
266f0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
26700 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
26710 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  y */.  int isLef
26720 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20  tJoin        /* 
26730 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69 73  True if pSubq is
26740 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
26750 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
26760 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
26770 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
26780 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65   0;.  if( pWhere
26790 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
267a0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
267b0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
267c0 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
267d0 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
267e0 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66   (2) */..#ifndef
267f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
26800 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70 53  DOWFUNC.  if( pS
26810 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65 74 75  ubq->pWin ) retu
26820 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65 73 74  rn 0;    /* rest
26830 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f 0a 23  riction (6) */.#
26840 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
26850 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
26860 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
26870 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
26880 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
26890 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
268a0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
268b0 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
268c0 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
268d0 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
268e0 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
268f0 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
26900 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
26910 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
26920 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
26930 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
26940 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
26950 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
26960 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
26970 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
26980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
26990 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
269a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
269b0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
269c0 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
269d0 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
269e0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
269f0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
26a00 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
26a10 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
26a20 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20  ->pRight,.      
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73 6f            iCurso
26a50 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a  r, isLeftJoin);.
26a60 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
26a70 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
26a80 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
26a90 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73 50  .   && (ExprHasP
26aa0 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
26ab0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20  P_FromJoin)==0. 
26ac0 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72          || pWher
26ad0 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
26ae0 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29  le!=iCursor).  )
26af0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
26b00 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26b10 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
26b20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26b30 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
26b40 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69  in) && pWhere->i
26b50 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
26b60 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  iCursor ){.    r
26b70 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26b80 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20  riction (5) */. 
26b90 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
26ba0 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
26bb0 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
26bc0 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
26bd0 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
26be0 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53  pSubq ){.      S
26bf0 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
26c00 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
26c10 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
26c20 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30  e->db, pWhere, 0
26c30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
26c40 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29  inExpr(pNew, -1)
26c50 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
26c60 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
26c70 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72   x.iTable = iCur
26c80 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  sor;.      x.iNe
26c90 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  wTable = iCursor
26ca0 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
26cb0 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Join = 0;.      
26cc0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71  x.pEList = pSubq
26cd0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
26ce0 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
26cf0 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (&x, pNew);.    
26d00 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
26d10 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
26d20 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  gate ){.        
26d30 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d  pSubq->pHaving =
26d40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
26d50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
26d60 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77  q->pHaving, pNew
26d70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26d80 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
26d90 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
26da0 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
26db0 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
26dc0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
26dd0 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
26de0 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
26df0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26e00 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
26e10 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
26e20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
26e30 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
26e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
26e50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70   */../*.** The p
26e60 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79  Func is the only
26e70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
26e80 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79  ion in the query
26e90 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a  .  Check to see.
26ea0 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ** if the query 
26eb0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
26ec0 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
26ed0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a  ptimization. .**
26ee0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
26ef0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
26f00 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
26f10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
26f20 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e  en set.** *ppMin
26f30 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44  Max to be an ORD
26f40 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
26f50 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
26f60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
26f70 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65  and return eithe
26f80 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
26f90 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
26fa0 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69  ERBY_MAX dependi
26fb0 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72  ng on.** whether
26fc0 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28   pFunc is a min(
26fd0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
26fe0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
26ff0 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  e query is not a
27000 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
27010 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
27020 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a  ization, return.
27030 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
27040 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d  _NORMAL (which m
27050 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a  ust be zero)..**
27060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27070 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
27080 61 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  after aggregate 
27090 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62  functions have b
270a0 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62  een.** located b
270b0 75 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20  ut before their 
270c0 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62  arguments have b
270d0 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f  een subjected to
270e0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e   aggregate.** an
270f0 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
27100 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
27110 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
27120 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c  pr *pFunc, ExprL
27130 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
27140 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
27150 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
27160 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  AL;      /* Retu
27170 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78  rn value */.  Ex
27180 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
27190 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b   pFunc->x.pList;
271a0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
271b0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
271c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
271d0 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20   *zFunc;        
271e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
271f0 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  ame of aggregate
27200 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20   function pFunc 
27210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
27220 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f  OrderBy;.  u8 so
27230 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65  rtOrder;..  asse
27240 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
27250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
27260 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  unc->op==TK_AGG_
27270 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
27280 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
27290 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
272a0 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20  ) return eRet;. 
272b0 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e   zFunc = pFunc->
272c0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  u.zToken;.  if( 
272d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
272e0 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
272f0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
27300 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
27310 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
27320 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a   SQLITE_SO_ASC;.
27330 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
27340 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
27350 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
27360 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
27370 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
27380 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c   sortOrder = SQL
27390 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d  ITE_SO_DESC;.  }
273a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
273b0 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70   eRet;.  }.  *pp
273c0 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42  MinMax = pOrderB
273d0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
273e0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
273f0 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
27400 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20   pOrderBy!=0 || 
27410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27420 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
27430 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
27440 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
27450 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74  sortOrder;.  ret
27460 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
27470 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
27480 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
27490 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
274a0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
274b0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
274c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
274d0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
274e0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
274f0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
27500 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
27510 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
27520 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
27530 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
27540 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
27550 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
27560 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
27570 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
27580 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
27590 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
275a0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
275b0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
275c0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
275d0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
275e0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
275f0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
27600 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
27610 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
27620 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
27630 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
27640 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
27650 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
27660 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
27670 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
27680 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
27690 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
276a0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
276b0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
276c0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
276d0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
276e0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
276f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
27700 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
27710 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
27720 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
27730 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
27740 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
27750 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
27760 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
27770 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
27780 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
27790 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
277a0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
277b0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
277c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
277d0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
277e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
277f0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
27800 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
27810 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
27820 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
27830 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
27840 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
27850 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
27860 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
27870 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
27880 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
27890 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
278a0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
278b0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
278c0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
278d0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
278e0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
278f0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
27900 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
27910 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
27920 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
27930 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
27940 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
27950 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
27960 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
27970 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
27980 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
27990 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
279a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
279b0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
279c0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
279d0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
279e0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
279f0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
27a00 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
27a10 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
27a20 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
27a30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27a40 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27a50 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
27a60 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
27a70 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
27a80 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
27a90 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
27aa0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
27ab0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
27ac0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
27ad0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
27ae0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
27af0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
27b00 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
27b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
27b20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27b30 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
27b40 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
27b50 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
27b60 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
27b70 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
27b80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27b90 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
27ba0 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
27bb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
27bc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
27bd0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
27be0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27bf0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
27c00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
27c10 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
27c20 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
27c30 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
27c40 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
27c50 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
27c60 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
27c70 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
27c80 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
27c90 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
27ca0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
27cb0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
27cc0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
27cd0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
27ce0 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
27cf0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
27d00 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
27d10 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
27d20 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
27d30 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
27d40 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
27d50 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
27d60 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
27d70 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
27d80 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
27d90 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
27da0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
27db0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
27dc0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
27dd0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
27de0 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
27df0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
27e00 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
27e10 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
27e20 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
27e30 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
27e40 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
27e50 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
27e60 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
27e70 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
27e80 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
27e90 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
27ea0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
27eb0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
27ec0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
27ed0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
27ee0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
27ef0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
27f00 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
27f10 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
27f20 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
27f30 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
27f40 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
27f50 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
27f60 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
27f70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
27f80 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
27f90 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
27fa0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
27fb0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27fc0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
27fd0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
27fe0 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
27ff0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
28000 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
28010 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28020 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
28030 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
28040 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
28050 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
28060 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
28070 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
28080 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
28090 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
280a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
280b0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
280c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
280d0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
280e0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
280f0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
28100 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
28110 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28120 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
28130 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
28140 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
28150 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
28160 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
28170 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
28180 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
28190 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
281a0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
281b0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
281c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
281d0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
281e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
281f0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
28200 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
28210 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28220 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
28230 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
28240 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
28250 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
28260 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
28270 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
28280 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
28290 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
282a0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
282b0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
282c0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
282d0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
282e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
282f0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
28300 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
28310 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
28320 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
28330 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
28340 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
28350 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
28360 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
28370 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
28380 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
28390 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
283a0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
283b0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
283c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
283d0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
283e0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
283f0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
28400 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
28410 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
28420 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
28430 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
28440 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
28450 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
28460 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
28470 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
28480 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
28490 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
284a0 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
284b0 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
284c0 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
284d0 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
284e0 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
284f0 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
28500 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
28510 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
28520 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
28530 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
28540 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
28550 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
28560 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
28570 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
28580 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
28590 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
285a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
285b0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
285c0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
285d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
285e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
285f0 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
28600 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
28610 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
28620 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
28630 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
28640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
28650 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
28660 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
28670 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
28680 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
28690 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
286a0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
286b0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
286c0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
286d0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
286e0 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
286f0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
28700 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
28710 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
28720 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
28730 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
28740 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
28750 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
28760 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
28770 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
28780 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
28790 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
287a0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
287b0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
287c0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
287d0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
287e0 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
287f0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
28800 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
28810 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
28820 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28840 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
28850 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
28860 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
28870 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
28880 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
28890 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
288a0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
288b0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
288c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
288d0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
288e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
288f0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
28900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
28910 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
28920 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
28930 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
28940 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
28950 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
28960 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
28970 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
28980 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
28990 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
289a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
289b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
289c0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
289d0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
289e0 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
289f0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
28a00 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
28a10 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
28a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28a30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28a40 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
28a50 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
28a60 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
28a70 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
28a80 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
28a90 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
28aa0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
28ab0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
28ac0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28ad0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
28ae0 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
28af0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
28b00 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
28b10 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
28b20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
28b30 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
28b40 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
28b50 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
28b60 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
28b70 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
28b80 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
28b90 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
28ba0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28bb0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
28bc0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
28bd0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
28be0 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
28bf0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
28c00 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
28c10 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
28c20 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
28c30 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
28c40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28c50 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
28c60 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
28c70 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
28c80 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
28c90 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
28ca0 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
28cb0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
28cc0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
28cd0 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
28ce0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
28cf0 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
28d00 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
28d10 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
28d20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
28d30 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
28d40 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
28d50 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
28d60 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
28d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
28d80 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
28d90 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
28da0 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
28db0 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
28dc0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
28dd0 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
28de0 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
28df0 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
28e00 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
28e10 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
28e20 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
28e30 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
28e40 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28e50 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
28e60 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
28e70 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
28e80 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
28e90 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
28ea0 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
28eb0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
28ec0 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
28ed0 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
28ee0 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
28ef0 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
28f00 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
28f10 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
28f20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
28f30 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
28f40 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
28f50 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
28f60 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
28f70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
28f80 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
28f90 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
28fa0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
28fb0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
28fc0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
28fd0 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
28fe0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
28ff0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29000 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
29010 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
29020 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
29030 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
29040 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29050 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
29060 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
29070 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
29080 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
29090 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
290a0 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
290b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
290c0 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
290d0 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
290e0 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
290f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29100 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
29110 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
29120 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
29130 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
29140 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
29150 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
29160 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
29170 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
29180 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
29190 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
291a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
291b0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
291c0 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
291d0 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
291e0 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
291f0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
29200 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
29210 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
29220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29230 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
29240 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
29250 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
29260 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
29270 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
29280 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
29290 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
292a0 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
292b0 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
292c0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
292d0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
292e0 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
292f0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
29300 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
29310 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
29320 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
29330 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
29340 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
29350 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
29360 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
29370 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
29380 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
29390 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
293a0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
293b0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
293c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
293d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
293e0 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
293f0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
29400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29410 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
29420 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
29430 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
29440 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
29450 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
29460 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
29470 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
29480 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
29490 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
294a0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
294b0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
294c0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
294d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
294e0 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
294f0 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
29500 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
29510 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
29520 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
29530 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
29540 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
29550 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
29560 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
29570 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
29580 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
29590 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
295a0 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
295b0 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
295c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
295d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
295e0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
295f0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
29600 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29610 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29620 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
29630 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
29640 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
29650 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
29660 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
29670 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
29680 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29690 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
296a0 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
296b0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
296c0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
296d0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
296e0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
296f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
29700 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
29710 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
29720 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
29730 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
29740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
29750 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
29760 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
29770 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
29780 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
29790 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
297a0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
297b0 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
297c0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
297d0 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
297e0 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
297f0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
29800 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
29810 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
29820 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
29830 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
29840 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
29850 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
29860 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
29870 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
29880 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
29890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
298a0 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
298b0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
298c0 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
298d0 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
298e0 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
298f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29900 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
29910 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
29920 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
29930 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
29940 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
29950 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
29960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29970 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
29980 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
29990 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20  TabRef==1 || .  
299a0 20 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c            ((pSel
299b0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
299c0 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
299d0 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
299e0 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
299f0 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
29a00 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
29a10 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
29a20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
29a30 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29a40 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
29a50 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
29a60 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
29a70 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
29a80 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
29a90 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
29aa0 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
29ab0 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
29ac0 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
29ad0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
29ae0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
29af0 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
29b00 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
29b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29b20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29b30 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
29b40 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
29b50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
29b60 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
29b70 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
29b80 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
29b90 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
29ba0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
29bb0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
29bc0 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
29bd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
29be0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
29bf0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
29c00 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
29c10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29c20 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
29c30 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
29c40 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
29c50 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
29c60 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
29c70 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
29c80 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
29c90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29ca0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29cb0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
29cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29cd0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
29ce0 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
29cf0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
29d00 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
29d10 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
29d20 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
29d30 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
29d40 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
29d50 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
29d60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
29d70 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
29d80 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
29d90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
29da0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
29db0 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
29dc0 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
29dd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29de0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
29df0 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
29e00 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
29e10 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
29e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
29e30 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29e40 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
29e50 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
29e60 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
29e70 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29e80 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
29e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29ea0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
29eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29ec0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
29ed0 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
29ee0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
29ef0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
29f00 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
29f10 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
29f20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
29f30 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
29f40 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
29f50 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
29f60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
29f70 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
29f80 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
29f90 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
29fa0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
29fb0 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
29fc0 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
29fd0 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
29fe0 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
29ff0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
2a000 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
2a010 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
2a020 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
2a030 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2a040 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a050 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2a060 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2a070 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2a080 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d  se->pWith) && p-
2a090 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
2a0a0 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
2a0b0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
2a0c0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
2a0d0 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
2a0e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
2a0f0 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
2a100 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
2a110 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
2a120 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
2a130 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
2a140 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
2a150 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2a160 54 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  The SrcList_item
2a170 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2a180 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2a190 61 72 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65  argument represe
2a1a0 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65  nts a.** sub-que
2a1b0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2a1c0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2a1d0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
2a1e0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
2a1f0 6c 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75  locates and popu
2a200 6c 61 74 65 73 20 74 68 65 20 53 72 63 4c 69 73  lates the SrcLis
2a210 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65  t_item.pTab obje
2a220 63 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ct. If successfu
2a230 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  l,.** SQLITE_OK 
2a240 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
2a250 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f  erwise, if an OO
2a260 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
2a270 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ntered,.** SQLIT
2a280 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
2a290 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
2a2a0 71 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  query(Parse *pPa
2a2b0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
2a2c0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
2a2d0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  {.  Select *pSel
2a2e0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2a2f0 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
2a300 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
2a310 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54  l );.  pFrom->pT
2a320 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
2a330 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2a340 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
2a350 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
2a360 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
2a370 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a380 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
2a390 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f   = 1;.  if( pFro
2a3a0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2a3b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a3c0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
2a3d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d  Parse->db, pFrom
2a3e0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c  ->zAlias);.  }el
2a3f0 73 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e  se{.    pTab->zN
2a400 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
2a410 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2a420 20 22 73 75 62 71 75 65 72 79 5f 25 75 22 2c 20   "subquery_%u", 
2a430 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20  pSel->selId);.  
2a440 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d  }.  while( pSel-
2a450 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
2a460 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
2a470 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  }.  sqlite3Colum
2a480 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
2a490 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
2a4a0 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ist,&pTab->nCol,
2a4b0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
2a4c0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
2a4d0 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
2a4e0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
2a4f0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
2a500 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
2a510 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  );.  pTab->tabFl
2a520 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
2a530 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  ral;..  return S
2a540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a550 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a560 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
2a570 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
2a580 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
2a590 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
2a5a0 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
2a5b0 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
2a5c0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
2a5d0 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
2a5e0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
2a5f0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
2a600 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
2a610 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
2a620 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a630 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
2a640 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
2a650 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
2a660 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
2a670 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
2a680 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
2a690 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
2a6a0 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
2a6b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a6c0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
2a6d0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
2a6e0 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
2a6f0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
2a700 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
2a710 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
2a720 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
2a730 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
2a740 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
2a750 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
2a760 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
2a770 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
2a780 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
2a790 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
2a7a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
2a7b0 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
2a7c0 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
2a7d0 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
2a7e0 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
2a7f0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
2a800 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
2a810 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
2a820 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2a830 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
2a840 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2a850 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
2a860 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
2a870 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2a880 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
2a890 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
2a8a0 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
2a8b0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
2a8c0 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
2a8d0 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
2a8e0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
2a8f0 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
2a900 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
2a910 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
2a920 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
2a930 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
2a940 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
2a950 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
2a960 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
2a970 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
2a980 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
2a990 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
2a9a0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
2a9b0 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
2a9c0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2a9d0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2a9e0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2a9f0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
2aa00 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
2aa10 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
2aa20 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
2aa30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2aa40 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
2aa50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2aa60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2aa70 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
2aa80 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
2aa90 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
2aaa0 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74  ags;.  u32 elist
2aab0 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d  Flags = 0;..  p-
2aac0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2aad0 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
2aae0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2aaf0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2ab00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
2ab10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
2ab20 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65  !=0 );.  if( (se
2ab30 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
2ab40 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
2ab50 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2ab60 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
2ab70 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
2ab80 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2ab90 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
2aba0 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
2abb0 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
2abc0 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
2abd0 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
2abe0 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
2abf0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
2ac00 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
2ac10 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
2ac20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
2ac30 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
2ac40 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
2ac50 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
2ac60 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
2ac70 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
2ac80 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
2ac90 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
2aca0 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
2acb0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
2acc0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
2acd0 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
2ace0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
2acf0 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
2ad00 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
2ad10 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
2ad20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
2ad30 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
2ad40 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
2ad50 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
2ad60 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2ad70 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
2ad80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2ad90 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2ada0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
2adb0 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
2adc0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2add0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
2ade0 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
2adf0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2ae00 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
2ae10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ae20 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
2ae30 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
2ae40 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
2ae50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2ae60 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
2ae70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
2ae80 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
2ae90 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
2aea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2aeb0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
2aec0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
2aed0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2aee0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
2aef0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2af00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2af10 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
2af20 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
2af30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2af40 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
2af50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2af60 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
2af70 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
2af80 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2af90 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2afa0 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79  e3ExpandSubquery
2afb0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2afc0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2afd0 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  rt;.#endif.    }
2afe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
2aff0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
2b000 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
2b010 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b020 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2b030 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2b040 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
2b050 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
2b060 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2b070 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
2b080 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
2b090 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
2b0a0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b0b0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
2b0c0 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29  TabRef>=0xffff )
2b0d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b0e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b0f0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
2b100 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
2b110 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
2b120 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
2b130 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
2b140 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
2b150 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2b160 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b170 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  }.      pTab->nT
2b180 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  abRef++;.      i
2b190 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
2b1a0 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
2b1b0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
2b1c0 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
2b1d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2b1e0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
2b1f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2b200 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
2b210 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
2b220 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b230 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
2b240 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
2b250 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2b260 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
2b270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2b280 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
2b290 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2b2a0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
2b2b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b2c0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b2d0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
2b2e0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
2b2f0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
2b300 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
2b310 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
2b320 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
2b330 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
2b340 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b350 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
2b360 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
2b370 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
2b380 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2b390 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
2b3a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
2b3b0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
2b3c0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
2b3d0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
2b3e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2b3f0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
2b400 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
2b410 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
2b420 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
2b430 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b440 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
2b450 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
2b460 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
2b470 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
2b480 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
2b490 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
2b4a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2b4b0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
2b4c0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
2b4d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2b4e0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
2b4f0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
2b500 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
2b510 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
2b520 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
2b530 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
2b540 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
2b550 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
2b560 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
2b570 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
2b580 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
2b590 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
2b5a0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
2b5b0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
2b5c0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
2b5d0 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
2b5e0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
2b5f0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
2b600 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
2b610 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
2b620 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
2b630 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
2b640 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
2b650 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
2b660 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
2b670 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
2b680 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
2b690 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
2b6a0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
2b6b0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
2b6c0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
2b6d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2b6e0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
2b6f0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
2b700 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
2b710 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
2b720 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
2b730 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
2b740 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
2b750 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2b760 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
2b770 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
2b780 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2b790 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
2b7a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
2b7b0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2b7c0 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
2b7d0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
2b7e0 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
2b7f0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
2b800 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
2b810 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
2b820 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
2b830 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
2b840 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
2b850 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
2b860 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2b870 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
2b880 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
2b890 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
2b8a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
2b8b0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
2b8c0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2b8d0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
2b8e0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
2b8f0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2b900 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
2b910 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
2b920 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
2b930 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
2b940 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2b950 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
2b960 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
2b970 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
2b980 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
2b990 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
2b9a0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
2b9b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
2b9c0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
2b9f0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
2ba00 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
2ba10 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
2ba20 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
2ba30 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
2ba40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
2ba50 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
2ba60 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
2ba70 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
2ba80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ba90 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2baa0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2bab0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
2bac0 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
2bad0 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
2bae0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
2baf0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
2bb00 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2bb10 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
2bb20 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
2bb30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2bb40 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
2bb50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2bb60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2bb70 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2bb80 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
2bb90 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2bba0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
2bbb0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
2bbc0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
2bbd0 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
2bbe0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
2bbf0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2bc00 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
2bc10 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
2bc20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
2bc30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
2bc40 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
2bc50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
2bc60 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
2bc70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bc80 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
2bc90 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
2bca0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
2bcb0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
2bcc0 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
2bcd0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
2bce0 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
2bcf0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
2bd00 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
2bd10 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
2bd20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
2bd30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
2bd40 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
2bd50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2bd60 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
2bd70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2bd80 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
2bd90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
2bda0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2bdb0 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
2bdc0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2bdd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
2bde0 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
2bdf0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
2be00 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2be10 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2be20 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2be30 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2be40 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
2be50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2be60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
2be70 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
2be80 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
2be90 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
2bea0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
2beb0 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
2bec0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2bed0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
2bee0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
2bef0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
2bf00 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
2bf10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2bf20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
2bf30 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
2bf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2bf60 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2bf70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2bf80 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
2bf90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
2bfa0 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
2bfc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bfd0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
2bfe0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2bff0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
2c000 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2c010 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c020 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c030 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
2c040 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2c050 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
2c060 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
2c070 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
2c080 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
2c090 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
2c0a0 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
2c0b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
2c0c0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
2c0d0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2c0e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2c0f0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
2c100 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2c110 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
2c120 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
2c130 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
2c140 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
2c150 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
2c160 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
2c170 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
2c180 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
2c190 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
2c1a0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
2c1b0 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
2c1c0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
2c1d0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
2c1e0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
2c1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c200 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2c220 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2c230 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
2c240 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
2c250 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
2c260 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c280 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c290 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c2a0 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
2c2b0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
2c2c0 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
2c2d0 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
2c2e0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2c2f0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
2c300 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
2c310 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
2c320 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
2c330 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
2c340 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
2c350 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2c360 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2c370 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
2c380 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
2c390 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
2c3a0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
2c3b0 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
2c3c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c3d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c3e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c3f0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
2c400 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
2c410 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
2c420 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
2c430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2c440 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
2c450 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
2c460 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2c470 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
2c480 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
2c490 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
2c4a0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
2c4b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2c4c0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
2c4d0 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
2c4e0 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
2c4f0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
2c500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
2c510 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
2c520 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c560 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2c570 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
2c580 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
2c590 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2c5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2c5b0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
2c5c0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
2c5d0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
2c5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c5f0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
2c600 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2c610 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
2c620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c630 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c660 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
2c670 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2c680 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
2c690 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2c6a0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
2c6b0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2c6c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2c6d0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
2c6e0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2c6f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2c700 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2c720 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2c730 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
2c740 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
2c750 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2c760 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2c770 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2c780 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
2c790 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
2c7a0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2c7c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2c7d0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
2c7e0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
2c7f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2c800 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c810 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2c820 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
2c830 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c840 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2c850 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
2c860 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2c870 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
2c880 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2c890 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
2c8a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2c8b0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
2c8c0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
2c8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c8f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2c900 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
2c910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c920 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2c930 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2c940 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
2c950 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2c960 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
2c970 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
2c980 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2c990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c9a0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
2c9b0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
2c9c0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
2c9d0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
2c9e0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2c9f0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
2ca00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ca10 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2ca20 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
2ca30 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2ca40 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
2ca50 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
2ca60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ca70 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2ca80 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2ca90 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2caa0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2cac0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2cad0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2cae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2cb00 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
2cb10 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2cb20 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
2cb60 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
2cb70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2cb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2cb90 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2cbc0 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cbe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cbf0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
2cc00 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
2cc10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cc20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
2cc30 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2cc40 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
2cc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cc60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2cc70 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2cc80 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
2cc90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2cca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ccb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2ccc0 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
2ccd0 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
2cce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ccf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2cd00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2cd10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2cd20 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
2cd30 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
2cd40 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
2cd50 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
2cd60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
2cd70 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2cd80 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
2cd90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2cda0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2cdb0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
2cdc0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
2cdd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2cde0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
2cdf0 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
2ce00 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
2ce10 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
2ce20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
2ce30 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
2ce40 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
2ce50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ce60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ce70 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2ce80 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2ce90 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
2cea0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2ceb0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
2cec0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2ced0 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
2cee0 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
2cef0 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
2cf00 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
2cf10 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
2cf20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
2cf30 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
2cf40 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2cf50 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
2cf60 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
2cf70 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
2cf80 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
2cf90 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2cfa0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
2cfb0 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
2cfc0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2cfd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cfe0 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
2cff0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
2d000 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
2d010 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d020 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2d030 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2d040 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2d050 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2d060 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2d070 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
2d080 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
2d090 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
2d0a0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2d0b0 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2d0c0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2d0d0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2d0e0 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2d0f0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2d100 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2d110 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2d120 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d130 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
2d140 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2d150 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
2d160 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
2d170 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
2d180 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
2d190 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
2d1a0 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
2d1b0 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
2d1c0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2d1d0 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
2d1e0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2d1f0 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2d200 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d210 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2d220 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
2d230 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
2d240 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2d250 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
2d260 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2d270 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2d280 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
2d290 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2d2a0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
2d2b0 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
2d2c0 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
2d2d0 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
2d2e0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
2d2f0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
2d300 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
2d310 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
2d320 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
2d330 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
2d340 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
2d350 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
2d360 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d370 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
2d380 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
2d390 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
2d3a0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
2d3b0 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
2d3c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
2d3d0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
2d3e0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2d3f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2d400 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
2d410 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2d420 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
2d430 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
2d440 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
2d450 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
2d460 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2d470 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
2d480 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2d490 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
2d4a0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2d4b0 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
2d4c0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2d4d0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2d4e0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2d4f0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2d500 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2d510 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2d520 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
2d530 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
2d540 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
2d550 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
2d560 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
2d570 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d580 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
2d590 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2d5a0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
2d5b0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2d5c0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
2d5d0 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
2d5e0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2d5f0 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
2d600 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2d610 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
2d620 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2d630 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2d640 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
2d650 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2d660 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
2d670 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
2d680 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
2d690 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
2d6a0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
2d6b0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2d6c0 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
2d6d0 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
2d6e0 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
2d6f0 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
2d700 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d710 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2d720 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
2d730 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
2d740 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2d750 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2d760 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2d770 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
2d780 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
2d790 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
2d7a0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
2d7b0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
2d7c0 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
2d7d0 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
2d7e0 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
2d7f0 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
2d800 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
2d810 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2d820 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2d830 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
2d840 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
2d850 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
2d860 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2d870 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
2d880 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2d890 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2d8a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
2d8b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2d8c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d8d0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
2d8e0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
2d8f0 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
2d900 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  d );.  if( p->se
2d910 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2d920 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2d930 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
2d940 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
2d950 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2d960 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2d970 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2d980 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
2d990 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2d9a0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2d9b0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2d9c0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2d9d0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2d9e0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2d9f0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2da00 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2da10 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2da20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2da30 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
2da40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2da50 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
2da60 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2da70 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2da80 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
2da90 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
2daa0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
2dab0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
2dac0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
2dad0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2dae0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
2daf0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
2db00 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
2db10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2db20 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2db30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
2db40 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
2db50 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2db60 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2db70 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
2db80 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
2db90 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2dba0 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
2dbb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2dbc0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
2dbd0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
2dbe0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
2dbf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2dc00 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2dc10 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
2dc20 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2dc30 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
2dc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2dc50 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
2dc60 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2dc70 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
2dc80 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
2dc90 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2dca0 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
2dcb0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
2dcc0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2dcd0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2dce0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2dcf0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2dd00 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2dd10 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2dd20 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2dd30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2dd40 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
2dd50 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
2dd60 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
2dd70 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
2dd80 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
2dd90 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
2dda0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
2ddb0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
2ddc0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
2ddd0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
2dde0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
2ddf0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2de00 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
2de10 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
2de20 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
2de30 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2de40 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
2de50 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
2de60 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
2de70 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
2de80 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
2de90 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
2dea0 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
2deb0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
2dec0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
2ded0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
2dee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2def0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
2df00 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
2df10 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
2df20 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
2df30 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
2df40 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
2df50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2df60 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2df70 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2df80 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2df90 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2dfa0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2dfb0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
2dfc0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
2dfd0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2dfe0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
2dff0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2e000 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
2e010 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e020 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2e030 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e040 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
2e050 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2e060 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2e070 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2e080 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
2e090 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
2e0a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2e0b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2e0c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2e0d0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
2e0e0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
2e0f0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
2e100 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
2e110 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2e120 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e130 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2e140 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2e150 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
2e160 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
2e170 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
2e180 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
2e190 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
2e1a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2e1b0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
2e1c0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
2e1d0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
2e1e0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
2e1f0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
2e200 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
2e210 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
2e220 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
2e230 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
2e240 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
2e250 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
2e260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2e270 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
2e280 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2e290 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2e2a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2e2b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2e2c0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2e2d0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2e2e0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2e2f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2e300 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2e310 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2e320 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2e330 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2e340 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2e350 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2e360 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2e370 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2e380 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2e390 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2e3a0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2e3b0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2e3c0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2e3d0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2e3e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2e3f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2e400 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2e410 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2e420 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2e430 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2e440 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2e450 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2e460 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2e470 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2e480 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2e490 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2e4a0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2e4b0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2e4c0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2e4d0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2e4e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2e4f0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2e500 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2e510 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2e520 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2e530 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2e540 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2e550 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2e560 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2e570 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2e580 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e590 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2e5a0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2e5b0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2e5c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2e5d0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2e5e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e5f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2e600 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2e610 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2e620 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2e630 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2e640 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2e650 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e660 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2e670 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2e680 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2e690 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2e6a0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2e6b0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2e6c0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2e6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2e6e0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2e6f0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2e700 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2e710 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
2e720 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  t,0,0);.        
2e730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e740 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2e750 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
2e760 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
2e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e780 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2e790 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2e7a0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
2e7b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2e7c0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
2e7d0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
2e7e0 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
2e7f0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
2e800 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
2e810 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
2e820 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
2e830 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2e840 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e850 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2e860 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2e870 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2e880 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2e890 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e8a0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
2e8b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2e8c0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2e8d0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2e8e0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2e8f0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2e900 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2e910 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2e920 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2e930 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2e940 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2e950 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e960 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
2e970 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
2e980 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
2e990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2e9a0 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2e9b0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2e9c0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
2e9d0 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
2e9e0 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
2e9f0 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
2ea00 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
2ea10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2ea20 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  sor position..**
2ea30 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69 73  .** If regAcc is
2ea40 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
2ea50 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28 29  ere are no min()
2ea60 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65 67   or max() aggreg
2ea70 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67 49  ates.** in pAggI
2ea80 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70  nfo, then only p
2ea90 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41 67 67  opulate the pAgg
2eaa0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2eab0 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 2a  or accumulator.*
2eac0 2a 20 72 65 67 69 73 74 65 72 73 20 69 20 72 65  * registers i re
2ead0 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63 6f  gister regAcc co
2eae0 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63 61  ntains 0. The ca
2eaf0 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20 63  ller will take c
2eb00 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e  are.** of settin
2eb10 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 72  g and clearing r
2eb20 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  egAcc..*/.static
2eb30 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2eb40 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2eb50 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41 63  Parse, int regAc
2eb60 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  c, AggInfo *pAgg
2eb70 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2eb80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2eb90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2eba0 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2ebb0 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2ebc0 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2ebd0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2ebe0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2ebf0 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2ec00 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2ec10 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2ec20 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2ec30 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2ec40 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2ec50 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2ec60 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2ec70 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2ec80 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2ec90 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2eca0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2ecb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2ecc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ecd0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2ece0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
2ecf0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2ed00 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
2ed10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
2ed20 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
2ed30 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2ed40 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
2ed50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2ed60 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2ed70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c  List, regAgg, 0,
2ed80 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
2ed90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2eda0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
2edb0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
2edc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2edd0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2ede0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
2edf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2ee00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2ee10 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2ee20 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72  ==0 );  /* Error
2ee30 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
2ee40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2ee50 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73  rg>1 );   /* Als
2ee60 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  o an error */.  
2ee70 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
2ee80 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
2ee90 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
2eea0 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
2eeb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2eec0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
2eed0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2eee0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
2eef0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
2ef00 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
2ef10 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2ef20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
2ef30 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
2ef40 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
2ef50 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
2ef60 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
2ef70 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
2ef80 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
2ef90 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
2efa0 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
2efb0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2efc0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2efd0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2efe0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
2eff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f000 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
2f010 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
2f020 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
2f030 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
2f040 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
2f050 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2f060 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
2f070 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
2f080 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2f090 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f0a0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
2f0b0 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
2f0c0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
2f0d0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
2f0e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f0f0 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
2f100 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
2f110 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->iMem);.    sql
2f120 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2f130 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2f140 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
2f150 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f160 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
2f170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2f180 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
2f190 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2f1a0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
2f1b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f1c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2f1d0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
2f1e0 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
2f1f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f200 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f210 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
2f220 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f230 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2f240 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
2f250 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
2f260 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
2f270 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
2f280 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
2f290 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
2f2a0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
2f2b0 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
2f2c0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
2f2d0 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
2f2e0 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
2f2f0 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
2f300 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
2f310 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
2f320 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
2f330 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
2f340 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
2f350 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
2f360 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
2f370 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
2f380 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
2f390 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
2f3a0 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
2f3b0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
2f3c0 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
2f3d0 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
2f3e0 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
2f3f0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
2f400 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
2f410 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
2f420 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
2f430 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
2f440 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
2f450 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
2f460 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
2f470 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
2f480 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20 20  umulator ){.    
2f490 72 65 67 48 69 74 20 3d 20 72 65 67 41 63 63 3b  regHit = regAcc;
2f4a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69  .  }.  if( regHi
2f4b0 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2f4c0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2f4d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2f4e0 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2f4f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2f500 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2f510 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2f520 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2f530 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2f540 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2f550 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2f560 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2f570 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2f580 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2f590 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2f5a0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2f5b0 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2f5c0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2f5d0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2f5e0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2f5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2f600 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2f610 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2f620 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2f630 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2f640 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2f650 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2f660 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2f670 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2f680 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2f690 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2f6a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f6b0 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2f6c0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2f6d0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2f6e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2f6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2f700 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2f710 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2f740 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2f750 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2f760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f770 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2f780 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2f790 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2f7a0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2f7b0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2f7c0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2f7d0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2f7e0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2f7f0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2f800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f810 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c  eExplain(pParse,
2f820 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20   0, "SCAN TABLE 
2f830 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2f840 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2f850 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2f860 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2f870 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2f880 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2f890 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2f8a0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2f8b0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2f8c0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2f8d0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2f8e0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2f8f0 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2f900 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2f910 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2f920 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2f930 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2f940 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2f950 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2f960 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2f970 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2f980 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2f990 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2f9a0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2f9b0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2f9c0 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2f9d0 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2f9e0 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2f9f0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2fa00 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2fa10 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2fa20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2fa30 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2fa40 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2fa50 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2fa60 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2fa70 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2fa80 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2fa90 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2faa0 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2fab0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2fac0 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2fad0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2fae0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2faf0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2fb00 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65  TK_AND ){.    Se
2fb10 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b  lect *pS = pWalk
2fb20 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20  er->u.pSelect;. 
2fb30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2fb40 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2fb50 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2fb60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
2fb70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2fb80 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2fb90 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2fba0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2fbb0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2fbc0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2fbd0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2fbe0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2fbf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2fc00 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2fc10 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70  Expr *pWhere = p
2fc20 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  S->pWhere;.     
2fc30 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2fc40 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2fc50 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2fc60 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2fc70 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2fc80 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
2fc90 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
2fca0 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2fcb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2fcc0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
2fcd0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2fce0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2fcf0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
2fd00 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
2fd10 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
2fd20 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
2fd30 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
2fd40 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
2fd50 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
2fd60 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2fd70 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
2fd80 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
2fd90 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
2fda0 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
2fdb0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
2fdc0 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2fdd0 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
2fde0 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
2fdf0 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
2fe00 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
2fe10 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
2fe20 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2fe30 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
2fe40 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
2fe50 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
2fe60 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
2fe70 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2fe80 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
2fe90 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
2fea0 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
2feb0 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
2fec0 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
2fed0 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
2fee0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2fef0 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
2ff00 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
2ff10 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
2ff20 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
2ff30 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
2ff40 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2ff50 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
2ff60 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
2ff70 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2ff80 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2ff90 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2ffa0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2ffb0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2ffc0 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2ffd0 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2ffe0 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
2fff0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
30000 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
30010 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
30020 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30030 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
30040 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
30050 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30060 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
30070 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
30080 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
30090 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
300a0 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
300b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
300c0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
300d0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
300e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
300f0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
30100 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
30110 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
30120 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
30130 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
30140 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
30150 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
30160 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
30170 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
30180 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
30190 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
301a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
301b0 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
301c0 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
301d0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
301e0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
301f0 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
30200 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
30210 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
30220 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
30230 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30240 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
30250 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
30260 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
30270 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
30280 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
30290 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
302a0 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
302b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
302c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
302d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
302e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
302f0 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f  iaCoroutine ) co
30300 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30310 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
30320 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30330 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
30340 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  cmp(pItem->zData
30350 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61  base, pThis->zDa
30360 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e  tabase)!=0 ) con
30370 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
30380 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
30390 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68  Item->zName, pTh
303a0 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  is->zName)!=0 ) 
303b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
303c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
303d0 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20  pare(0, .       
303e0 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63     pThis->pSelec
303f0 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  t->pWhere, pItem
30400 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
30410 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  e, -1) .    ){. 
30420 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
30430 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
30440 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
30450 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
30460 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
30470 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
30480 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
30490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
304a0 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
304b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
304c0 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
304d0 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
304e0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
304f0 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
30500 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
30510 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
30520 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30530 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
30540 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
30550 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
30560 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
30570 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30580 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
30590 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
305a0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
305b0 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
305c0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
305d0 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
305e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
305f0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
30600 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
30610 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
30620 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
30630 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
30640 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
30650 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
30660 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20   clause.**   *  
30670 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52  There is no WHER
30680 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  E or GROUP BY or
30690 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
306a0 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  on the subquerie
306b0 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75  s.**   *  The ou
306c0 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73  ter query is a s
306d0 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a  imple count(*).*
306e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
306f0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
30700 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b  tion is undertak
30710 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
30720 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74  t countOfViewOpt
30730 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20  imization(Parse 
30740 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
30750 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
30760 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20  Sub, *pPrior;.  
30770 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
30780 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73  xpr *pCount;.  s
30790 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
307a0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
307b0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d   SF_Aggregate)==
307c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
307d0 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67  /* This is an ag
307e0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
307f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
30800 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
30810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30820 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  * Single result 
30830 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70  column */.  pExp
30840 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
30850 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
30860 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
30870 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
30880 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
30890 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61  * Result is an a
308a0 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66  ggregate */.  if
308b0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
308c0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
308d0 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74  n,"count") ) ret
308e0 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f  urn 0;  /* Is co
308f0 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70  unt() */.  if( p
30900 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
30910 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30930 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29  Must be count(*)
30940 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72   */.  if( p->pSr
30950 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
30960 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30970 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74          /* One t
30980 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f  able in FROM  */
30990 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
309a0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
309b0 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29  .  if( pSub==0 )
309c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309e0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
309f0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a   is a subquery *
30a00 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
30a10 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
30a20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30a30 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
30a40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a   a compound ry *
30a50 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  /.  do{.    if( 
30a60 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  pSub->op!=TK_ALL
30a70 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72   && pSub->pPrior
30a80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
30a90 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41   Must be UNION A
30aa0 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  LL */.    if( pS
30ab0 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74  ub->pWhere ) ret
30ac0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30ae0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
30af0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
30b00 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
30b10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49          /* No LI
30b30 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
30b40 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
30b50 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
30b60 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ate ) return 0; 
30b70 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67      /* Not an ag
30b80 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70  gregate */.    p
30b90 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  Sub = pSub->pPri
30ba0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20   /* Repeat over 
30bd0 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77  compound */.  }w
30be0 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20  hile( pSub );.. 
30bf0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
30c00 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20  this point then 
30c10 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66  it is OK to perf
30c20 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72  orm the transfor
30c30 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  mation */..  db 
30c40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
30c50 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a  pCount = pExpr;.
30c60 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70    pExpr = 0;.  p
30c70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
30c80 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70  [0].pSelect;.  p
30c90 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
30ca0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lect = 0;.  sqli
30cb0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
30cc0 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
30cd0 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74   p->pSrc = sqlit
30ce0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
30cf0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
30d00 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20  f(*p->pSrc));.  
30d10 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20  while( pSub ){. 
30d20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a     Expr *pTerm;.
30d30 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75      pPrior = pSu
30d40 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  b->pPrior;.    p
30d50 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  Sub->pPrior = 0;
30d60 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74  .    pSub->pNext
30d70 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e   = 0;.    pSub->
30d80 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
30d90 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53  ggregate;.    pS
30da0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ub->selFlags &= 
30db0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
30dc0 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
30dd0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ow = 0;.    sqli
30de0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
30df0 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  e(db, pSub->pELi
30e00 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  st);.    pTerm =
30e10 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65   pPrior ? sqlite
30e20 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
30e30 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74  unt, 0) : pCount
30e40 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69  ;.    pSub->pELi
30e50 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
30e60 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
30e70 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20  e, 0, pTerm);.  
30e80 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
30e90 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
30ea0 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b  K_SELECT, 0, 0);
30eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70  .    sqlite3PExp
30ec0 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73  rAddSelect(pPars
30ed0 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b  e, pTerm, pSub);
30ee0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d  .    if( pExpr==
30ef0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
30f00 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65   = pTerm;.    }e
30f10 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
30f20 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
30f30 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c  pParse, TK_PLUS,
30f40 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a   pTerm, pExpr);.
30f50 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d      }.    pSub =
30f60 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70   pPrior;.  }.  p
30f70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
30f80 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
30f90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
30fa0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23  SF_Aggregate;..#
30fb0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
30fc0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
30fd0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
30fe0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
30ff0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
31000 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
31010 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20  r count-of-view 
31020 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22  optimization:\n"
31030 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
31040 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
31050 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
31060 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
31070 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31080 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
31090 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  TIMIZATION */../
310a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
310b0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
310c0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
310d0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
310e0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
310f0 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
31100 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
31110 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
31120 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
31130 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
31140 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
31150 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
31160 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
31170 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
31180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
31190 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
311a0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
311b0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
311c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
311d0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
311e0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
311f0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
31200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
31210 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
31220 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
31230 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
31240 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
31250 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
31260 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
31270 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
31280 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
31290 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
312a0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
312b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
312c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
312d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
312e0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
312f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
31300 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
31310 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
31320 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
31330 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
31340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
31350 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
31360 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
31370 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
31380 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
31390 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
313a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
313b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
313c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
313d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
313e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
313f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31400 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
31410 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
31420 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
31430 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30  List *pEList = 0
31440 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f  ;  /* List of co
31450 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
31460 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
31470 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
31480 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
31490 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
314a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
314b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
314c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
314d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
314e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
314f0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
31500 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
31510 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
31520 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
31530 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
31540 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
31550 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
31560 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
31570 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
31580 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
31590 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
315a0 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
315b0 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
315c0 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
315d0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
315e0 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
315f0 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
31600 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
31610 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
31620 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
31630 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
31640 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
31650 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
31660 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
31670 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
31680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31690 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
316a0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
316b0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
316c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
316d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
316e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
316f0 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f  prList *pMinMaxO
31700 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20  rderBy = 0;  /* 
31710 41 64 64 65 64 20 4f 52 44 45 52 20 42 59 20 66  Added ORDER BY f
31720 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69  or min/max queri
31730 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61  es */.  u8 minMa
31740 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  xFlag;          
31750 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66         /* Flag f
31760 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69  or min/max queri
31770 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  es */..  db = pP
31780 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
31790 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
317a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Parse);.  if( p=
317b0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
317c0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
317d0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
317e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
317f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
31800 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
31810 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
31820 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
31830 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
31840 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
31850 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
31860 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
31870 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
31880 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67  ,pParse,p, ("beg
31890 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e  in processing:\n
318a0 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  ", pParse->addrE
318b0 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20  xplain));.  if( 
318c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
318d0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
318e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
318f0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
31900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
31910 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
31920 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
31930 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
31940 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
31950 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31960 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31970 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
31980 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
31990 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
319a0 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
319b0 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
319c0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
319d0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
319e0 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
319f0 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
31a00 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
31a10 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
31a20 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
31a30 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
31a40 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
31a50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
31a60 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31a70 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
31a80 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
31a90 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
31aa0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
31ab0 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
31ac0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31ad0 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
31ae0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
31af0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
31b00 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
31b10 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
31b20 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
31b30 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
31b40 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
31b50 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
31b60 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
31b70 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
31b80 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
31b90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
31ba0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31bb0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
31bc0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
31bd0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
31be0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
31bf0 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
31c00 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
31c10 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69  arse, p, 0);.  i
31c20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
31c30 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
31c40 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
31c50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
31c60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
31c70 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45  ist!=0 );.#if SE
31c80 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31c90 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
31ca0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
31cb0 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  04 ){.    SELECT
31cc0 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61 72  TRACE(0x104,pPar
31cd0 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61  se,p, ("after na
31ce0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e  me resolution:\n
31cf0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
31d00 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
31d10 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
31d20 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73 74  dif..  if( pDest
31d30 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
31d40 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
31d50 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
31d60 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
31d70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31d80 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
31d90 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64   if( sqlite3Wind
31da0 6f 77 52 65 77 72 69 74 65 28 70 50 61 72 73 65  owRewrite(pParse
31db0 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , p) ){.    goto
31dc0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
31dd0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
31de0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
31df0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
31e00 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20  e & 0x108 ){.   
31e10 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
31e20 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
31e30 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72  fter window rewr
31e40 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ite:\n"));.    s
31e50 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31e60 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31e70 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   }.#endif.#endif
31e80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
31e90 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
31ea0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
31eb0 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70  rc;.  isAgg = (p
31ec0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
31ed0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
31ee0 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
31ef0 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
31f00 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
31f10 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
31f20 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  y;..  /* Try to 
31f30 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
31f40 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e  tions (flattenin
31f50 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e  g subqueries, an
31f60 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20  d strength.  ** 
31f70 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69  reduction of joi
31f80 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20  n operators) in 
31f90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
31fa0 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  up into the main
31fb0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20   query.  */.#if 
31fc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
31fd0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
31fe0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
31ff0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
32000 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
32010 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
32020 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
32030 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32040 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
32050 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
32060 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
32070 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
32080 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  t;.    Table *pT
32090 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
320a0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
320b0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f  t LEFT JOIN into
320c0 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61   JOIN if there a
320d0 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
320e0 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20  right table.    
320f0 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a  ** of the LEFT J
32100 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20  OIN used in the 
32110 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
32120 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
32130 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
32140 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
32150 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
32160 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
32170 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  Row(p->pWhere, p
32180 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
32190 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
321a0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
321b0 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f  QLITE_SimplifyJo
321c0 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  in).    ){.     
321d0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
321e0 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  00,pParse,p,.   
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c               ("L
32200 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66  EFT-JOIN simplif
32210 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74  ies to JOIN on t
32220 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20  erm %d\n",i));. 
32230 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a       pItem->fg.j
32240 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f  ointype &= ~(JT_
32250 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a  LEFT|JT_OUTER);.
32260 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45        unsetJoinE
32270 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
32280 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
32290 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
322a0 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69   futher action i
322b0 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74  f this term of t
322c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
322d0 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20  s no a subquery 
322e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  */.    if( pSub=
322f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
32300 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
32310 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
32320 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
32330 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
32340 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
32350 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
32360 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
32370 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
32380 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
32390 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
323a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
323b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
323c0 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
323d0 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
323e0 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
323f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
32400 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
32410 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
32420 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
32430 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
32440 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
32450 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f  /* Do not try to
32460 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72   flatten an aggr
32470 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a  egate subquery..
32480 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c      **.    ** Fl
32490 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72  attening an aggr
324a0 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69  egate subquery i
324b0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
324c0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
324d0 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ry.    ** is not
324e0 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
324f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32500 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20   is not a join, 
32510 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
32520 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  y.    ** will be
32530 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
32540 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64  a co-routine and
32550 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
32560 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  antage to.    **
32570 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74   flattening in t
32580 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  hat case..    */
32590 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e  .    if( (pSub->
325a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
325b0 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f  gregate)!=0 ) co
325c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
325d0 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  rt( pSub->pGroup
325e0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  By==0 );..    /*
325f0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
32600 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  ery contains a "
32610 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20  complex" result 
32620 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20  set (that is,.  
32630 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75    ** if the resu
32640 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
32650 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66  ter query uses f
32660 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71  unctions or subq
32670 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61  ueries).    ** a
32680 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65  nd if the subque
32690 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f  ry contains an O
326a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
326b0 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  nd if.    ** it 
326c0 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
326d0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
326e0 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ine, then do not
326f0 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a   flatten.  This.
32700 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69      ** restricti
32710 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f  on allows SQL co
32720 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68  nstructs like th
32730 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
32740 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73  *  SELECT expens
32750 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a  ive_function(x).
32760 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28      **    FROM (
32770 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
32780 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d  b ORDER BY y LIM
32790 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20  IT 10);.    **. 
327a0 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73     ** The expens
327b0 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69  ive_function() i
327c0 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20  s only computed 
327d0 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74  on the 10 rows t
327e0 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f  hat.    ** are o
327f0 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68  utput, rather th
32800 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20  an every row of 
32810 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
32820 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71  *.    ** The req
32830 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
32840 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
32850 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73  ve a complex res
32860 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d  ult set.    ** m
32870 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65  eans that flatte
32880 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20  ning does occur 
32890 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63  on simpler SQL c
328a0 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f  onstraints witho
328b0 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78  ut.    ** the ex
328c0 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
328d0 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a  () like:.    **.
328e0 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78      **  SELECT x
328f0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
32900 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
32910 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
32920 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
32930 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a  ub->pOrderBy!=0.
32940 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20       && i==0.   
32950 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
32960 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65  s & SF_ComplexRe
32970 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26  sult)!=0.     &&
32980 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
32990 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
329a0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
329b0 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
329c0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
329d0 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
329e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
329f0 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ..    if( flatte
32a00 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
32a10 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29  , p, i, isAgg) )
32a20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
32a30 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
32a40 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
32a50 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
32a60 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
32a70 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
32a80 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
32a90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32aa0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32ab0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67  end;.    if( !Ig
32ac0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
32ad0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
32ae0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
32af0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
32b00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
32b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32b20 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
32b30 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
32b40 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
32b50 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
32b60 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
32b70 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
32b80 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
32b90 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
32ba0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
32bb0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
32bc0 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53  p, pDest);.#if S
32bd0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
32be0 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ED.    SELECTTRA
32bf0 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c  CE(0x1,pParse,p,
32c00 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
32c10 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
32c20 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28  \n"));.    if( (
32c30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
32c40 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20  ce & 0x2000)!=0 
32c50 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  && ExplainQueryP
32c60 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65  lanParent(pParse
32c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
32c80 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32c90 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32ca0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
32cb0 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  f( p->pNext==0 )
32cc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
32cd0 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
32ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
32cf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
32d00 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73   the WHERE-claus
32d10 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61  e constant propa
32d20 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74  gation optimizat
32d30 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a 20  ion if this is. 
32d40 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20   ** a join.  No 
32d50 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20 74 69  need to speed ti
32d60 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72 61  me on this opera
32d70 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69  tion for non-joi
32d80 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 61  n queries.  ** a
32d90 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
32da0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69   optimization wi
32db0 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  ll be handled by
32dc0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69   query planner i
32dd0 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68  n.  ** sqlite3Wh
32de0 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f  ereBegin()..  */
32df0 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
32e00 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f 70  >nSrc>1.   && Op
32e10 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
32e20 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f  d(db, SQLITE_Pro
32e30 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20 20  pagateConst).   
32e40 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  && propagateCons
32e50 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 29  tants(pParse, p)
32e60 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54  .  ){.#if SELECT
32e70 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
32e90 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
32ea0 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
32eb0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
32ec0 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 6e  se,p,("After con
32ed0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
32ee0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  n:\n"));.      s
32ef0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
32f00 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
32f10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
32f20 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  lse{.    SELECTT
32f30 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
32f40 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70  e,p,("Constant p
32f50 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68  ropagation not h
32f60 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d  elpful\n"));.  }
32f70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
32f80 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
32f90 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f  MIZATION.  if( O
32fa0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
32fb0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
32fc0 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c  eryFlattener|SQL
32fd0 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29  ITE_CountOfView)
32fe0 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69  .   && countOfVi
32ff0 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70  ewOptimization(p
33000 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20  Parse, p).  ){. 
33010 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
33020 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
33030 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
33040 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
33050 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  t;.    pTabList 
33060 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23  = p->pSrc;.  }.#
33070 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20  endif..  /* For 
33080 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
33090 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f   FROM clause, do
330a0 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a   two things:.  *
330b0 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64  * (1) Authorized
330c0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61   unreferenced ta
330d0 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65  bles.  ** (2) Ge
330e0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
330f0 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a  all sub-queries.
33100 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
33110 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
33120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
33130 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
33140 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
33150 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
33160 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
33170 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b     Select *pSub;
33180 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
33190 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
331a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
331b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
331c0 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ).    const char
331d0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
331e0 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ext;.#endif..   
331f0 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45   /* Issue SQLITE
33200 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
33210 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65  ions with a fake
33220 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72   column name for
33230 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c   any.    ** tabl
33240 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66 65  es that are refe
33250 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20  renced but from 
33260 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20  which no values 
33270 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20  are extracted.. 
33280 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f     ** Examples o
33290 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b 69  f where these ki
332a0 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49  nds of null SQLI
332b0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
332c0 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f  ations.    ** wo
332d0 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a  uld occur:.    *
332e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
332f0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
33300 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54  M t1;   -- SQLIT
33310 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20  E_READ t1."".   
33320 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74   **     SELECT t
33330 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b  1.* FROM t1, t2;
33340 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
33350 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20  D t2."".    **. 
33360 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63     ** The fake c
33370 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e  olumn name is an
33380 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
33390 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
333a0 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20  or a table to.  
333b0 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75    ** have a colu
333c0 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  mn named by the 
333d0 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e  empty string, in
333e0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72   which case ther
333f0 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20  e is no way to. 
33400 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73     ** distinguis
33410 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72  h between an unr
33420 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
33430 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65  and an actual re
33440 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20  ference to the. 
33450 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e     ** "" column.
33460 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
33470 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65  sign was for the
33480 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33490 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a  e to be a NULL,.
334a0 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
334b0 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75  ld be unambiguou
334c0 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61  s.  But legacy a
334d0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
334e0 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20  lbacks might.   
334f0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63   ** assume the c
33500 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f  olumn name is no
33510 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61  n-NULL and segfa
33520 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ult.  The use of
33530 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a   an empty.    **
33540 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
33550 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
33560 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20   seems safer..  
33570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74    */.    if( pIt
33580 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29  em->colUsed==0 )
33590 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  {.      sqlite3A
335a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
335b0 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49   SQLITE_READ, pI
335c0 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20  tem->zName, "", 
335d0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
335e0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  );.    }..#if !d
335f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
33600 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
33610 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
33620 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f  OMIT_VIEW).    /
33630 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
33640 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
33650 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
33660 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20  clause.    */.  
33670 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e    pSub = pItem->
33680 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
33690 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
336a0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
336b0 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
336c0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
336d0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
336e0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
336f0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
33700 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
33710 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
33720 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
33730 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
33740 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
33750 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
33760 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
33770 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
33780 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
33790 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
337a0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
337b0 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
337c0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
337d0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
337e0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
337f0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
33800 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
33810 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
33820 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
33830 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
33840 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
33850 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
33860 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  fg.viaCoroutine=
33870 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
33880 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   The subroutine 
33890 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74  that manifests t
338a0 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65  he view might be
338b0 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74   a one-time rout
338c0 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ine,.        ** 
338d0 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64  or it might need
338e0 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20   to be rerun on 
338f0 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62  each iteration b
33900 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
33910 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63    ** encodes a c
33920 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
33930 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  ry. */.        t
33940 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
33950 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74  VdbeGetOp(v, pIt
33960 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
33970 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63  ->opcode==OP_Onc
33980 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
33990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
339a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
339b0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
339c0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
339d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
339e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
339f0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
33a00 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
33a10 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
33a20 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
33a30 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
33a40 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
33a50 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
33a60 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
33a70 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
33a80 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
33a90 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
33aa0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
33ab0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
33ac0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
33ad0 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
33ae0 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
33af0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
33b00 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
33b10 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
33b20 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
33b30 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
33b40 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
33b50 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
33b60 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
33b70 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
33b80 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
33b90 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
33ba0 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63  constant WHERE-c
33bb0 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74  lause terms in t
33bc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
33bd0 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  own.    ** insid
33be0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
33bf0 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74   This can help t
33c00 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72  he subquery to r
33c10 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  un more efficien
33c20 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
33c30 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
33c40 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
33c50 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20  TE_PushDown).   
33c60 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65    && pushDownWhe
33c70 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
33c80 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  pSub, p->pWhere,
33c90 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
33ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74              (pIt
33cc0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
33cd0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a  & JT_OUTER)!=0).
33ce0 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43      ){.#if SELEC
33cf0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
33d00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
33d10 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
33d20 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53  100 ){.        S
33d30 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
33d40 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
33d50 20 20 20 20 20 20 20 28 22 41 66 74 65 72 20 57         ("After W
33d60 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
33d70 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71 75  -down into subqu
33d80 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75 62  ery %d:\n", pSub
33d90 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20  ->selId));.     
33da0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
33db0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
33dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
33dd0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
33de0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
33df0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
33e00 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
33e10 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
33e20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
33e30 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
33e40 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
33e50 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
33e60 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
33e70 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
33e80 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
33e90 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
33ea0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
33eb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
33ec0 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
33ed0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
33ee0 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
33ef0 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
33f00 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
33f10 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
33f20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
33f30 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
33f40 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
33f50 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
33f60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
33f70 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
33f80 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
33f90 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
33fa0 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
33fb0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
33fc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33fd0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
33fe0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
33ff0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
34000 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
34010 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
34020 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
34030 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
34040 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
34050 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
34060 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
34070 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
34080 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
34090 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
340a0 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
340b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
340c0 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
340d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
340e0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
340f0 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
34100 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
34110 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
34120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34130 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
34140 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
34150 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
34160 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
34170 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
34180 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
34190 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
341a0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
341b0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
341c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
341d0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
341e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
341f0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
34200 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
34210 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
34220 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45  , 1, "CO-ROUTINE
34230 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49   %u", pSub->selI
34240 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d));.      sqlit
34250 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
34260 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
34270 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
34280 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
34290 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
342a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
342b0 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
342c0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
342d0 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
342e0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
342f0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
34300 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
34310 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
34320 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
34330 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
34340 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
34350 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
34360 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
34370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
34380 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
34390 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
343a0 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
343b0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
343c0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
343d0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
343e0 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
343f0 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
34400 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
34410 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
34420 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
34430 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
34440 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
34450 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
34460 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
34470 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
34480 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
34490 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
344a0 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
344b0 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
344c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
344d0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
344e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
344f0 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
34500 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
34510 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
34520 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
34530 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
34540 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
34550 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
34560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34570 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
34580 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34590 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
345a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
345b0 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
345c0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
345d0 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
345e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
345f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
34600 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
34610 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
34620 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
34630 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
34640 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
34650 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
34660 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
34670 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
34680 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
34690 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
346a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
346b0 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
346c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
346d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
346e0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
346f0 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
34700 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
34710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34720 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
34730 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
34740 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
34750 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
34760 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
34770 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73       pPrior = is
34780 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61  SelfJoinView(pTa
34790 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20  bList, pItem);. 
347a0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
347b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
347c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
347d0 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65  OP_OpenDup, pIte
347e0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69  m->iCursor, pPri
347f0 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  or->iCursor);.  
34800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34810 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  rior->pSelect!=0
34820 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62   );.        pSub
34830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
34840 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  Prior->pSelect->
34850 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
34860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34870 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
34880 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
34890 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
348a0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
348b0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
348c0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
348d0 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 25  , "MATERIALIZE %
348e0 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29  u", pSub->selId)
348f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34900 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
34910 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
34920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
34930 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
34940 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
34950 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
34960 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
34970 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
34980 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
34990 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
349a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
349b0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
349c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
349d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
349e0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
349f0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
34a00 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
34a10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
34a20 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
34a30 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
34a40 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
34a50 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
34a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
34a70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34a80 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
34a90 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  d;.    pParse->n
34aa0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
34ab0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
34ac0 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65  t(p);.    pParse
34ad0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
34ae0 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
34af0 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  xt;.#endif.  }..
34b00 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65    /* Various ele
34b10 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  ments of the SEL
34b20 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ECT copied into 
34b30 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
34b40 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69  for.  ** conveni
34b50 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  ence */.  pEList
34b60 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
34b70 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
34b80 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
34b90 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
34ba0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
34bb0 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
34bc0 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
34bd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
34be0 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20  tinct)!=0;..#if 
34bf0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
34c00 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
34c10 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
34c20 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
34c30 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
34c40 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
34c50 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61  ll FROM-clause a
34c60 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
34c70 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
34c80 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
34c90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
34ca0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
34cb0 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
34cc0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
34cd0 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
34ce0 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
34cf0 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
34d00 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
34d10 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
34d20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
34d30 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
34d40 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
34d50 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
34d60 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
34d70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
34d80 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
34d90 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
34da0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
34db0 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
34dc0 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
34dd0 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
34de0 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
34df0 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
34e00 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
34e10 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
34e20 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
34e30 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
34e40 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
34e50 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
34e60 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
34e70 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
34e80 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
34e90 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
34ea0 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
34eb0 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
34ec0 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
34ed0 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
34ee0 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
34ef0 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
34f00 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
34f10 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
34f20 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
34f30 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
34f40 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
34f50 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
34f60 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
34f70 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
34f80 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
34f90 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
34fa0 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a   pEList, -1)==0.
34fb0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
34fc0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
34fd0 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70  inct;.    pGroup
34fe0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
34ff0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
35000 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
35010 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74  , 0);.    /* Not
35020 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
35030 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
35040 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
35050 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
35060 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
35070 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
35080 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
35090 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
350a0 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
350b0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
350c0 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
350d0 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
350e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
350f0 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
35100 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
35110 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45  sTnct );..#if SE
35120 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
35130 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
35140 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
35150 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x400 ){.      SE
35160 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
35170 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73  pParse,p,("Trans
35180 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e  form DISTINCT in
35190 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29  to GROUP BY:\n")
351a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
351b0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
351c0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
351d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
351e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
351f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
35200 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
35210 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
35220 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
35230 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
35240 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
35250 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
35260 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
35270 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
35280 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
35290 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
352a0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
352b0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
352c0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
352d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
352e0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
352f0 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
35300 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
35310 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
35320 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
35330 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
35340 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
35350 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35360 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
35370 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
35380 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
35390 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
353a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
353b0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
353c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
353d0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
353e0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
353f0 73 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  st(.        pPar
35400 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
35410 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
35420 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
35430 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
35440 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
35450 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35460 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
35470 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
35480 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
35490 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
354a0 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
354b0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
354c0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
354d0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
354e0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
354f0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
35500 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
35510 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
35520 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
35530 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
35540 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
35550 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
35560 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
35570 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
35580 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
35590 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
355a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
355b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
355c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
355d0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
355e0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
355f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
35600 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
35610 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
35620 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
35630 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
35640 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
35650 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  t)==0 ){.    p->
35660 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
35670 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
35680 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f  rows */.  }.  co
35690 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
356a0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
356b0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
356c0 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
356d0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
356e0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
356f0 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
35700 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
35710 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
35720 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
35730 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
35740 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
35750 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
35760 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
35770 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
35780 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
35790 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
357a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
357b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
357c0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
357d0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
357e0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
357f0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
35800 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35810 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35820 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
35830 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
35840 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
35850 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
35860 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
35870 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
35880 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
35890 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
358a0 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
358b0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
358c0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
358d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
358e0 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
358f0 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
35900 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
35910 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35920 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
35930 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
35940 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
35950 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
35960 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
35970 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
35980 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
35990 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
359a0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
359b0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
359c0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
359d0 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
359e0 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
359f0 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 0a  T_DISTINCT : 0).
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67     | (p->selFlag
35a20 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
35a30 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
35a40 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
35a50 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  NC.    Window *p
35a60 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20  Win = p->pWin;  
35a70 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77 69      /* Master wi
35a80 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72 20  ndow object (or 
35a90 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66 28  NULL) */.    if(
35aa0 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 73   pWin ){.      s
35ab0 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
35ac0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57 69  Init(pParse, pWi
35ad0 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  n);.    }.#endif
35ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
35af0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
35b00 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 0a  _FixedLimit );..
35b10 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
35b20 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
35b30 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52   */.    SELECTTR
35b40 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
35b50 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
35b60 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  ;.    pWInfo = s
35b70 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35b80 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
35b90 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
35ba0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
35bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bc0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
35bd0 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
35be0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b   p->nSelectRow);
35bf0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
35c00 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
35c10 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
35c20 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
35c30 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
35c40 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
35c50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
35c60 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
35c70 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
35c80 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
35c90 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
35ca0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
35cb0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
35cc0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
35cd0 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
35ce0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
35cf0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
35d00 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
35d10 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
35d20 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
35d30 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
35d40 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
35d50 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
35d60 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f  ;.      sSort.bO
35d70 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
35d80 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
35d90 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70  deredInnerLoop(p
35da0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
35db0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
35dc0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
35dd0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
35de0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35df0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
35e00 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
35e10 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
35e20 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
35e30 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
35e40 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
35e50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
35e60 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
35e70 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
35e80 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
35e90 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
35ea0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
35eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35ec0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35ed0 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
35ee0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
35ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35f00 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
35f10 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35f20 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
35f30 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
35f40 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69  st==pEList );.#i
35f50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35f60 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
35f70 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
35f80 20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62     int addrGosub
35f90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35fa0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
35fb0 20 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71    int iCont = sq
35fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
35fd0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
35fe0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
35ff0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
36000 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  );.      int reg
36010 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65  Gosub = ++pParse
36020 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73  ->nMem;..      s
36030 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
36040 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Step(pParse, p, 
36050 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62  pWInfo, regGosub
36060 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20  , addrGosub);.. 
36070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
36090 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
360a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
360b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
360c0 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
360d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
360e0 74 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f  t((v, "inner-loo
360f0 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  p subroutine"));
36100 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
36110 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
36120 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
36130 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
36140 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
36150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36160 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36170 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
36180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36190 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
361a0 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  regGosub);.     
361b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
361c0 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70   "end inner-loop
361d0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
361e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
361f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
36200 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 65   iBreak);.    }e
36210 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
36220 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
36230 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  FUNC */.    {.  
36240 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
36250 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
36260 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 65 6c  op. */.      sel
36270 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
36280 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
36290 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
362a0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
362b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
362c0 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
362d0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  o),.          sq
362e0 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
362f0 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
36300 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65        /* End the
36310 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
36320 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
36330 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
36340 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
36350 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
36360 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
36370 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
36380 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
36390 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
363a0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
363b0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
363c0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
363d0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
363e0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
363f0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
36400 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
36410 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
36420 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
36430 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
36440 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
36450 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
36460 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
36470 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
36480 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
36490 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
364a0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
364b0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
364c0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
364d0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
364e0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
364f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36500 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
36510 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
36520 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
36530 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
36540 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
36550 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
36560 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
36570 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
36580 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
36590 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
365a0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
365b0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
365c0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
365d0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
365e0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
365f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
36600 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
36610 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
36620 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
36630 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
36640 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
36650 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
36660 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
36670 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
36680 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
36690 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
366a0 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
366b0 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
366c0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
366d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
366e0 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
366f0 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
36700 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
36710 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
36720 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
36730 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
36740 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
36750 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
36760 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
36770 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
36780 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
36790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
367a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
367b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
367c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
367d0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
367e0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
367f0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
36800 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
36810 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
36820 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
36830 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
36840 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
36850 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
36860 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
36870 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
36880 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
36890 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
368a0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
368b0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
368c0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
368d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
368e0 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
368f0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
36900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
36910 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
36920 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
36930 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
36940 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
36950 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
36960 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
36970 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
36980 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
36990 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
369a0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
369b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
369c0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
369d0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
369e0 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
369f0 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
36a00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
36a10 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
36a20 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
36a30 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
36a40 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
36a50 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
36a60 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
36a70 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
36a80 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
36a90 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
36aa0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
36ab0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
36ac0 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
36ad0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
36ae0 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
36af0 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
36b00 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
36b10 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
36b20 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
36b30 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
36b40 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
36b50 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
36b60 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
36b70 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
36b80 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
36b90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
36ba0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
36bb0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
36bc0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
36bd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
36be0 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
36bf0 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
36c00 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
36c10 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
36c20 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
36c30 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
36c40 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
36c50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
36c60 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
36c70 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
36c80 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
36c90 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
36ca0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
36cb0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
36cc0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
36cd0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
36ce0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
36cf0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
36d00 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
36d10 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
36d20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
36d30 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
36d40 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
36d50 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
36d60 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e  st;.    sNC.uNC.
36d70 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
36d80 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e  Info;.    VVA_ON
36d90 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  LY( sNC.ncFlags 
36da0 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29  = NC_UAggInfo; )
36db0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
36dc0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
36dd0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
36de0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
36df0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
36e00 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
36e10 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
36e20 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
36e30 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
36e40 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
36e50 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
36e60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
36e70 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
36e80 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
36e90 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
36ea0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
36eb0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
36ec0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36ed0 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
36ee0 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  re );.        as
36ef0 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d 70  sert( pHaving==p
36f00 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20 20  ->pHaving );.   
36f10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47 72       assert( pGr
36f20 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70  oupBy==p->pGroup
36f30 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  By );.        ha
36f40 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
36f50 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
36f60 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
36f70 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
36f80 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
36f90 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
36fa0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
36fb0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
36fc0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
36fd0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
36fe0 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47  n;.    if( p->pG
36ff0 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e  roupBy==0 && p->
37000 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73 41  pHaving==0 && sA
37010 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20  ggInfo.nFunc==1 
37020 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ){.      minMaxF
37030 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
37040 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  y(db, sAggInfo.a
37050 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26  Func[0].pExpr, &
37060 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b  pMinMaxOrderBy);
37070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37080 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57    minMaxFlag = W
37090 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
370a0 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MAL;.    }.    f
370b0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
370c0 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
370d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
370e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
370f0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
37100 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
37110 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
37120 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
37130 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
37140 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
37150 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
37160 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37170 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
37180 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
37190 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
371a0 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
371b0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
371c0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
371d0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
371e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
371f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69  o select_end;.#i
37200 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
37210 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
37220 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
37230 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
37240 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
37250 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
37260 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
37270 65 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61  er aggregate ana
37280 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
37290 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
372a0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
372b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
372c0 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
372d0 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
372e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
372f0 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63  bugPrintf("agg-c
37300 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25  olumn[%d] iMem=%
37310 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37320 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
37330 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  Col[ii].iMem);. 
37340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
37350 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
37360 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
37370 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
37380 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d   }.      for(ii=
37390 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
373a0 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Func; ii++){.   
373b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
373c0 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e  gPrintf("agg-fun
373d0 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e  c[%d]: iMem=%d\n
373e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
373f0 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  i, sAggInfo.aFun
37400 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  c[ii].iMem);.   
37410 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
37420 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67  ViewExpr(0, sAgg
37430 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70  Info.aFunc[ii].p
37440 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
37450 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
37460 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
37470 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
37480 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
37490 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
374a0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
374b0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
374c0 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
374d0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
374e0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
374f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
37500 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
37510 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
37520 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
37530 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
37540 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
37550 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
37560 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
37570 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
37580 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
37590 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
375a0 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
375b0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
375c0 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
375d0 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
375e0 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
375f0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
37600 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
37610 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
37620 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
37630 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
37640 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
37650 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
37660 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
37670 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
37680 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
37690 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
376a0 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
376b0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
376c0 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
376d0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
376e0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
376f0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
37700 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
37710 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
37720 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
37730 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
37740 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
37750 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
37760 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
37770 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
37780 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
37790 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
377a0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
377b0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
377c0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
377d0 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
377e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
377f0 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
37800 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
37810 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
37820 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
37830 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
37840 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
37850 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
37860 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
37870 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
37880 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
37890 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
378a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
378b0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
378c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
378d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
378e0 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67 67 49  pGroupBy,0,sAggI
378f0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
37900 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
37910 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
37920 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
37930 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
37940 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
37950 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
37960 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
37970 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
37980 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
37990 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
379a0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
379b0 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
379c0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
379d0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
379e0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
379f0 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
37a00 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
37a10 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
37a20 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
37a30 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
37a40 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
37a50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37a60 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
37a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
37a80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
37a90 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
37aa0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37ab0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
37ac0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
37ad0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
37ae0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
37af0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
37b00 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
37b10 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
37b20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
37b30 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
37b40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
37b50 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
37b60 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
37b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37b80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
37b90 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
37ba0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
37bb0 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
37bc0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
37bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
37be0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
37bf0 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
37c00 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
37c10 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
37c20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
37c30 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
37c40 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
37c50 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
37c60 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
37c70 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
37c80 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
37c90 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
37ca0 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
37cb0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
37cc0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
37cd0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
37ce0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
37cf0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
37d00 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
37d10 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
37d20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37d40 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
37d50 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
37d60 73 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  set);.      SELE
37d70 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
37d80 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c  ,p,("WhereBegin\
37d90 6e 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  n"));.      pWIn
37da0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
37db0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
37dc0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
37dd0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
37de0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
37df0 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
37e00 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
37e10 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
37e20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
37e30 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
37e40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
37e50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
37e60 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
37e70 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
37e80 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
37e90 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
37ea0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
37eb0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
37ec0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
37ed0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
37ee0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
37ef0 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
37f00 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
37f10 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
37f20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
37f30 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
37f40 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
37f50 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
37f60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37f70 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
37f80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37f90 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
37fa0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
37fb0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
37fc0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
37fd0 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
37fe0 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
37ff0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
38000 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
38010 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
38020 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
38030 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
38040 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
38050 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
38060 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
38070 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
38080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
38090 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
380a0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
380b0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
380c0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
380d0 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
380e0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
380f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
38100 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
38110 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
38120 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
38130 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
38140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38150 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
38160 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
38170 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
38180 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
38190 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
381a0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
381b0 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
381c0 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
381d0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
381e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
381f0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
38200 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
38210 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
38220 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
38230 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
38240 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
38250 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
38260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
38270 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
38280 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
38290 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
382a0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
382b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
382c0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
382d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
382e0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
382f0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
38300 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b   regBase, 0, 0);
38310 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
38320 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
38330 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
38340 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
38350 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
38360 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
38370 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
38380 2e 61 43 6f 6