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

Artifact e6c6a75e9aac747ea26b5e2d1d7a9af50b813ea5524d4ec556a0afc72a6d69d4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 70 50 61 72 73 65 2c 20 2a 70 70 57 68 65 72  (pParse, *ppWher
2da0: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2db0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2dc0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2dd0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2de0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2df0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2e00: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2e10: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
2e20: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
2e30: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
2e40: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
2e50: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2e60: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2e70: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2e80: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2e90: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2ea0: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2eb0: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2ec0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2ee0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2ef0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2f00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2f10: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2f20: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2f30: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2f40: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2f50: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2f60: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2f70: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2f80: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2f90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2fa0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2fb0: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2fc0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2fd0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2fe0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2ff0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
3000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
3010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
3020: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3030: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
3040: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
3050: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
3060: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
3070: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
3080: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
3090: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
30a0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
30b0: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
30c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
30d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
30f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
3100: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
3110: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
3120: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
3130: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
3140: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
3150: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
3160: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
3170: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
3180: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
3190: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
31a0: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
31b0: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
31c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
31d0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
31e0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
31f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
3200: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
3210: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
3220: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
3230: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
3240: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
3250: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
3260: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
3280: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
3290: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
32a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
32b0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
32c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
32e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
32f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
3300: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
3310: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
3320: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
3330: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
3340: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
3350: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
3360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3370: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
3430: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
3440: 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f   Undo the work o
3450: 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e  f setJoinExpr().
3460: 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73    In the express
3470: 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76  ion tree p, conv
3480: 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72  ert every.** ter
3490: 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64  m that is marked
34a0: 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
34b0: 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e  n and iRightJoin
34c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e  Table==iTable in
34d0: 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
34e0: 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74  y term that omit
34f0: 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  s the EP_FromJoi
3500: 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  n mark..**.** Th
3510: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
3520: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73  a LEFT JOIN is s
3530: 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61  implified into a
3540: 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
3550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3560: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  unsetJoinExpr(Ex
3570: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
3580: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
3590: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
35a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
35b0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
35c0: 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70  & (iTable<0 || p
35d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
35e0: 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20  e==iTable) ){.  
35f0: 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
3600: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
3610: 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Join);.    }.   
3620: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3630: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3640: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3650: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3660: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3680: 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69          unsetJoi
3690: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
36a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
36b0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
36c0: 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f     }.    unsetJo
36d0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
36e0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
36f0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
3700: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3710: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3720: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3730: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3750: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3760: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3770: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3780: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3790: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
37a0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
37b0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
37c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
37d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
37e0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
37f0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
3800: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3810: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3820: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3830: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3840: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3850: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3860: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3870: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3880: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3890: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
38a0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
38b0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
38c0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
38d0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
38e0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
38f0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
3900: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3910: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3920: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3930: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3940: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3950: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3960: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3980: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3990: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
39a0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
39b0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
39c0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
39d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
39e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3a20: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3a30: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3a50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3a60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3a70: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3a80: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3a90: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3ab0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
3ac0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
3ad0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
3ae0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
3af0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
3b00: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3b10: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3b30: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3b40: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  {.    Table *pRi
3b60: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
3b70: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
3b80: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
3b90: 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54   NEVER(pLeft->pT
3ba0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
3bb0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
3bc0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
3bd0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
3be0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3bf0: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3c00: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3c10: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3c20: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3c30: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3c40: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3c50: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3c60: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3c70: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3c80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
3ca0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
3cb0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
3cc0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
3cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3cf0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3d00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3d20: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3d30: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3d40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3d60: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3d70: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d90: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
3da0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
3db0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3dd0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
3de0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3e00: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3e10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3e20: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3e30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3e40: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3e60: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3e70: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e80: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3e90: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
3ea0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
3eb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3ec0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ed0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3f00: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3f10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3f20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3f30: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3f40: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3f50: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3f60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3f70: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3f80: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3fb0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
3fc0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
3fd0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
3fe0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3ff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
4000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4010: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
4020: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
4030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4040: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
4050: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
4060: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
4070: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
4080: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
4090: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
40a0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
40b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
40c0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
40d0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
40e0: 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  rAnd(pParse, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ac0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11ae0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11b00 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11b10 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11b30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11b40 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11b50 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11b60 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11b70 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11b80 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b90 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11bb0 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11bc0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11be0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11bf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c10 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11c20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11c50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11c80 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c90 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11cb0 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11cc0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11cd0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11ce0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11cf0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11d00 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11d10 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11d20 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11d30 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11d40 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11d50 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11d60 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11d70 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11d80 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d90 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11da0 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11db0 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11dc0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11dd0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11de0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11e00 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11e10 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e40 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11e50 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11e70 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11e80 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11ea0 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11eb0 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11ec0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11ed0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11f10 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11f20 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11f30 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11f40 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11f50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11f60 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11f70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11f80 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11fa0 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11fb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11fc0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12010 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12020 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12030 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12040 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12050 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12060 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12070 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12080 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12090 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
120a0 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
120b0 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
120c0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
120d0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
120e0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
120f0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12110 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12120 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12130 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12140 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12150 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12160 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12170 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12180 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12190 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
121a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
121b0 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
121c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
121d0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
121e0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
121f0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12200 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12210 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12220 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12230 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12240 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12250 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12260 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12270 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12280 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12290 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
122a0 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
122b0 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
122c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
122d0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
122e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
122f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12300 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12310 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12320 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12330 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12340 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12350 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12360 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12370 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12380 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12390 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
123a0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
123b0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
123c0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
123d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
123e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
123f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12400 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12410 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12420 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12430 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12440 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12450 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12460 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12470 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12480 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61  ;.  u64 savedFla
12490 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
124a0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
124b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124c0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
124d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
124e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
124f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12510 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12520 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  t, 0);.  db->fla
12530 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
12570 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
12580 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
12590 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73  rior;.  pTab = s
125a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
125b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
125c0 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
125d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
125e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
125f0 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12600 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12610 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12620 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12630 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12640 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
12650 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
12660 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
12670 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
12680 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
12690 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
126a0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
126b0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
126c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
126d0 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
126e0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
126f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12700 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12710 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12720 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12730 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12740 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
12750 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
12760 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
12770 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
12780 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12790 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
127a0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
127b0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
127c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
127d0 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
127e0 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
127f0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12800 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12810 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12820 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12830 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12840 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
12850 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
12860 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
12870 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
12880 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
12890 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
128a0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
128b0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
128c0 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
128d0 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
128e0 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
128f0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12900 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12910 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12920 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12930 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12940 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
12950 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
12960 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
12970 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
12980 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
12990 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
129a0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
129b0 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
129c0 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
129d0 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
129e0 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
129f0 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12a00 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12a10 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12a20 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12a30 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12a40 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12a50 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
12a60 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
12a70 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
12a80 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
12a90 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
12aa0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
12ab0 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12ac0 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12ad0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12ae0 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12af0 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12b00 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12b10 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12b20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12b30 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12b40 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
12b60 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
12b70 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
12b80 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
12b90 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
12ba0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12bb0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12bc0 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12bd0 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12be0 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12bf0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12c00 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12c10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12c20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12c30 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12c40 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12c50 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
12c60 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
12c70 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
12c80 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
12c90 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
12ca0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
12cb0 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12cc0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12cd0 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12ce0 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12cf0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12d00 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12d10 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12d20 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12d30 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12d40 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12d50 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
12d60 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
12d70 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
12d80 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
12d90 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
12da0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
12db0 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12dc0 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12dd0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12de0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12df0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12e00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12e10 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12e20 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12e30 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12e40 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12e50 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
12e60 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
12e70 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
12e80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
12e90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
12ea0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
12eb0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12ec0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12ed0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12ee0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12ef0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12f00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12f10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12f20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12f30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12f40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12f50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
12f60 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b  .  if( pLimit ){
12f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12f80 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49  mit->op==TK_LIMI
12f90 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
12fa0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
12fb0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  0 );.    p->iLim
12fc0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
12fd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12fe0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12ff0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13000 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13010 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13020 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13030 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e  Limit->pLeft, &n
13040 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
13050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13060 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
13070 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
13080 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13090 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
130a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
130b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
130c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42  e3VdbeGoto(v, iB
130d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
130e0 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
130f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c  ->nSelectRow>sql
13100 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13110 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n) ){.        p-
13120 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
13130 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13140 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )n);.        p->
13150 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46  selFlags |= SF_F
13160 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20  ixedLimit;.     
13170 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
131a0 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69  it->pLeft, iLimi
131b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
131c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
131d0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
131e0 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
131f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
13200 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13210 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
13220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13240 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
13250 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
13260 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
13270 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69   if( pLimit->pRi
13280 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ght ){.      p->
13290 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
132a0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
132b0 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
132c0 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
132d0 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
132e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
132f0 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
13300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13310 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
13320 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66  it->pRight, iOff
13330 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
13340 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13350 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
13360 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
13370 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13380 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13390 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
133a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
133b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
133c0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
133d0 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
133e0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
133f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13400 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
13410 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
13420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13430 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
13440 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
13450 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
13460 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13470 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
13480 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
13490 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
134a0 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
134b0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
134c0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
134d0 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
134e0 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
134f0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
13500 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
13510 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
13520 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
13530 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
13540 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
13550 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
13560 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
13570 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
13580 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
13590 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
135a0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
135b0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
135c0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
135d0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
135e0 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
135f0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
13600 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
13610 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13620 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
13630 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
13640 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
13650 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
13660 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
13670 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
13680 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
13690 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
136a0 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
136b0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
136c0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
136d0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
136e0 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
136f0 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
13700 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
13710 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
13720 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
13730 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
13740 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
13750 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13760 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
13770 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
13780 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
13790 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
137a0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
137b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
137c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
137d0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
137e0 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
137f0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
13800 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
13810 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13820 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
13830 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
13840 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
13850 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
13860 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
13870 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
13880 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
13890 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
138a0 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
138b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
138c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
138d0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
138e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
138f0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
13900 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
13910 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
13920 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
13930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
13940 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
13950 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
13960 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
13970 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
13980 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
13990 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
139a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
139b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
139c0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
139d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
139e0 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
139f0 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
13a00 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
13a10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13a20 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
13a30 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
13a40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13a50 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
13a60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
13a70 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
13a80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
13a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13aa0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
13ab0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
13ac0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
13ad0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
13ae0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13af0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
13b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13b10 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
13b20 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13b30 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
13b40 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
13b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
13b60 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
13b70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
13b80 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
13b90 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
13ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13bb0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
13bc0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
13bd0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
13be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13bf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
13c00 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
13c10 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
13c20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
13c30 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
13c40 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
13c50 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
13c60 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
13c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13c80 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
13c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ca0 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
13cb0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
13cc0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
13cd0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
13ce0 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
13cf0 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
13d00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13d10 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
13d20 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
13d30 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
13d40 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
13d50 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
13d90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
13dc0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
13dd0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
13de0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
13df0 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
13e00 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
13e10 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
13e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
13e30 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
13e40 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
13e50 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
13e60 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
13e70 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
13e80 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
13e90 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
13ea0 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
13eb0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
13ec0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
13ed0 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
13ee0 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
13ef0 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
13f00 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
13f10 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
13f20 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
13f30 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
13f40 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
13f50 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
13f60 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
13f70 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
13f80 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
13f90 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
13fa0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
13fb0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
13fc0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
13fd0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
13fe0 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
13ff0 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
14000 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14010 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
14020 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
14030 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
14040 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
14050 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
14060 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
14070 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
14080 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
14090 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
140a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
140b0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
140c0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
140d0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
140e0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
140f0 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
14100 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
14110 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
14120 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
14130 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
14140 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
14150 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
14160 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
14170 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
14180 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
14190 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
141a0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
141b0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
141c0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
141d0 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
141e0 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
141f0 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
14200 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
14210 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
14220 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
14230 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
14240 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
14250 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
14260 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
14270 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
14280 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
14290 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
142a0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
142b0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
142c0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
142d0 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
142e0 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
142f0 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
14300 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
14310 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
14320 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
14330 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
14340 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
14350 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
14360 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
14370 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
14380 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
14390 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
143a0 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
143b0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
143c0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
143d0 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
143e0 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
143f0 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
14400 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
14410 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
14420 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
14430 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
14440 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
14450 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14460 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14470 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14480 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14490 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
144a0 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
144b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
144c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
144d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
144e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
144f0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14500 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
14510 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
14520 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
14530 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
14540 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
14550 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
14560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
14570 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
14580 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
14590 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
145a0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
145b0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
145c0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
145d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
145e0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
145f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
14600 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
14610 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
14620 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14630 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
14640 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
14650 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
14660 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
14670 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
14680 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
14690 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
146a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
146b0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
146c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
146d0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
146e0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
146f0 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
14700 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
14710 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
14720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14730 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14740 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
14750 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14760 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
14770 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
14780 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
14790 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
147a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
147b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
147c0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
147d0 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
147e0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
147f0 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
14800 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14810 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14840 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
14870 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
14880 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
14890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
148a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
148b0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
148e0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
148f0 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
14900 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
14910 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
14920 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
14930 53 45 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  SET */..#ifndef 
14940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
14950 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e  OWFUNC.  if( p->
14960 70 57 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  pWin ){.    sqli
14970 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14980 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
14990 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
149a0 20 69 6e 20 72 65 63 75 72 73 69 76 65 20 71 75   in recursive qu
149b0 65 72 69 65 73 22 29 3b 0a 20 20 20 20 72 65 74  eries");.    ret
149c0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
149d0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
149e0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
149f0 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
14a00 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
14a10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14a20 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
14a30 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
14a40 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
14a50 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
14a60 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
14a70 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
14a80 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
14a90 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
14aa0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
14ab0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
14ac0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
14ad0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
14ae0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14af0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14b00 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
14b10 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14b20 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
14b30 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
14b40 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
14b50 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
14b60 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
14b70 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
14b80 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
14b90 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
14ba0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
14bb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
14bc0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
14bd0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
14be0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
14bf0 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
14c00 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
14c10 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
14c20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
14c30 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
14c40 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
14c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
14c60 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14c70 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
14c80 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
14c90 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
14ca0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
14cb0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
14cc0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
14cd0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
14ce0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14cf0 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14d00 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14d10 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14d20 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14d30 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14d40 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
14d50 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
14d60 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14d70 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14d80 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
14d90 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
14da0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
14db0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14dc0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
14dd0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14de0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14df0 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14e00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14e10 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14e20 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14e30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14e40 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
14e50 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
14e60 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
14e70 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
14e80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
14e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14ea0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
14eb0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
14ec0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
14ed0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14ee0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14ef0 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14f00 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14f10 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14f40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
14f50 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
14f60 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
14f90 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
14fa0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
14fb0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14fe0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14ff0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
15000 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
15010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
15020 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
15030 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
15040 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15050 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
15060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15070 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
15080 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
15090 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
150a0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
150b0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
150c0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
150d0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
150e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
150f0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
15100 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
15110 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
15120 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
15130 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
15140 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
15150 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65   0;.  ExplainQue
15160 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15170 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20  1, "SETUP"));.  
15180 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
15190 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
151a0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
151b0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
151c0 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = p;.  if( rc ) 
151d0 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75  goto end_of_recu
151e0 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20  rsive_query;..  
151f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
15200 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75   row in the Queu
15210 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61  e and output tha
15220 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54  t row */.  addrT
15230 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15250 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64  ind, iQueue, add
15260 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
15270 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
15280 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78  Transfer the nex
15290 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f  t row in Queue o
152a0 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a  ver to Current *
152b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
152c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
152d0 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20  Row, iCurrent); 
152e0 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75  /* To reset colu
152f0 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66  mn cache */.  if
15300 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15320 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
15330 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
15340 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
15350 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  Current);.  }els
15360 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
15370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15380 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20  owData, iQueue, 
15390 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
153a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153b0 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
153c0 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  e, iQueue);..  /
153d0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e  * Output the sin
153e0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
153f0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74  nt */.  addrCont
15400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15410 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
15420 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15430 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
15440 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
15450 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15460 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
15470 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
15480 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
15490 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
154a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
154b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
154c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
154d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
154e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
154f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15500 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
15510 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15520 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
15530 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
15540 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
15550 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
15560 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
15570 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
15580 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
15590 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
155a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
155b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
155c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
155d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
155e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
155f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15600 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
15610 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
15620 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
15630 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
15640 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
15650 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15660 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
15670 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
15680 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15690 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
156a0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
156b0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
156c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
156d0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
156e0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
156f0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
15700 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
15710 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
15720 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
15730 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
15740 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15750 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
15760 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15770 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
15780 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15790 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
157a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
157b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
157c0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
157d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
157e0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
157f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
15800 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
15810 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
15820 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15830 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
15840 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15850 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15860 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15870 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15880 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15890 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
158a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
158b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
158c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
158d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
158e0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
158f0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
15900 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
15910 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
15920 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
15930 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
15940 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
15950 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
15960 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
15970 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
15980 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
15990 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
159a0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
159b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
159c0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
159d0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
159e0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
159f0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
15a00 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
15a10 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
15a20 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
15a30 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
15a40 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
15a50 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
15a60 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
15a70 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
15a80 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
15a90 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
15aa0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15ab0 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
15ac0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15ad0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
15ae0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
15af0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
15b00 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
15b10 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
15b20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
15b30 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
15b40 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
15b50 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
15b60 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
15b70 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
15b80 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
15b90 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
15ba0 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
15bb0 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
15bc0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
15bd0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
15be0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
15bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15c00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
15c10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15c20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15c30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15c40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15c50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
15c60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
15c70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
15c80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15c90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15ca0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15cb0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
15cc0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
15cd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
15ce0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
15cf0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
15d00 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15d10 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15d20 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15d30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15d40 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15d60 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15d70 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15d80 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15d90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15da0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15db0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15dc0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
15dd0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15de0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
15df0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15e00 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15e10 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15e20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15e30 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15e40 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15e50 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15e60 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15e70 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15e80 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15e90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15ea0 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15eb0 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
15ec0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
15ed0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15ee0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
15ef0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
15f00 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
15f10 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
15f20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15f30 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
15f40 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
15f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15f60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15f70 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
15f80 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
15f90 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
15fa0 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
15fb0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
15fc0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
15fd0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
15fe0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
15ff0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
16000 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
16010 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
16020 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
16030 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
16040 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
16050 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
16060 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
16070 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
16080 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
16090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
160a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
160b0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
160c0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
160d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
160e0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
160f0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
16100 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
16110 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
16120 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
16130 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
16140 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
16150 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
16160 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16170 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16180 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
16190 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
161a0 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
161b0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
161c0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
161d0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
161e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
161f0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
16200 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
16210 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
16220 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
16230 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
16250 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
16260 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
16270 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
16280 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
16290 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
162a0 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
162b0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
162c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
162d0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
162e0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
162f0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
16300 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
16310 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
16320 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
16330 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
16340 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
16350 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
16360 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
16370 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
16380 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
16390 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
163a0 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
163b0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
163c0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
163d0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
163e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
163f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16400 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16420 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
16430 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
16440 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
16450 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
16460 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16470 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
16480 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
16490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
164a0 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
164b0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
164c0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
164d0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
164e0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
164f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
16500 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
16510 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16520 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16530 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16540 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16550 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
16560 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
16570 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
16580 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
16590 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
165a0 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
165b0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
165c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
165d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
165e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
165f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
16610 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
16620 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
16630 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
16640 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
16650 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
16660 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
16670 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
16680 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
16690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
166a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
166b0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
166c0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
166d0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
166e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
166f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16700 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
16710 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
16720 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
16730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16740 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
16750 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16760 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16770 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
167a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
167b0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
167c0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
167d0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
167e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
167f0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
16800 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
16810 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16820 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
16830 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16840 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16850 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16860 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16870 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16880 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16890 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
168a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
168b0 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
168c0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
168d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
168e0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
168f0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
16900 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
16910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16920 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
16930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16940 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16950 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16960 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16970 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16980 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16990 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
169a0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
169b0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
169c0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
169d0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
169e0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
169f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16a00 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
16a10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
16a20 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
16a30 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16a40 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
16a50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16a60 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16a70 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16a80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16a90 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16aa0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16ab0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16ac0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16ad0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16ae0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16af0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
16b00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16b10 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
16b20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
16b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16b40 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
16b50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16b60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16b70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16b80 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16b90 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16ba0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16bb0 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16bc0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16bd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16be0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16bf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
16c00 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16c10 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
16c20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
16c30 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
16c40 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
16c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16c60 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
16c70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
16c80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
16c90 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16ca0 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
16cb0 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
16cc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16cd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
16ce0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
16cf0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
16d00 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
16d10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16d20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16d40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16d50 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16d60 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16d70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16d80 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16d90 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16db0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
16dc0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16dd0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
16de0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
16df0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
16e00 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16e10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16e20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16e30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16e50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16e60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16e70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16e80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16e90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16ea0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16ec0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16ed0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
16ee0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
16ef0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
16f00 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
16f10 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
16f20 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
16f30 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
16f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f50 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16f60 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
16f70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16f80 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
16f90 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
16fa0 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
16fb0 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
16fc0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
16fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ff0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
17000 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
17030 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
17040 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
17050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17060 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17070 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
17080 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
17090 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
170a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
170b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
170c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
170d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
170e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
170f0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17100 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17110 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17120 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17130 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17140 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17150 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17160 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17170 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
17180 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
17190 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
171a0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
171b0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
171c0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
171d0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
171e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
171f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17200 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
17210 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
17220 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17230 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
17240 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
17250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17260 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
17270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17280 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
172a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
172b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
172c0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
172d0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
172e0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
172f0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
17300 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17310 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
17320 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
17330 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
17340 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
17350 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
17360 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
17370 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
17380 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
17390 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
173a0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
173b0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
173c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
173d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
173e0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
173f0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
17400 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17410 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17420 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
17430 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17440 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
17450 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
17460 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17470 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
17480 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
17490 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
174a0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
174b0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
174c0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
174d0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
174e0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
174f0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
17500 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
17510 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
17520 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17530 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
17540 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
17550 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
17560 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
17570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17580 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
17590 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
175a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
175b0 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
175c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
175d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
175e0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
175f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
17600 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
17610 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17620 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
17630 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17640 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
17650 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
17670 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17690 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
176a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
176b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
176c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
176d0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
176e0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
176f0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
17700 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
17710 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
17720 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
17730 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
17740 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17750 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17760 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
17770 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
17780 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
17790 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
177a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
177b0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
177c0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
177d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
177e0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
177f0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
17800 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
17810 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17820 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17830 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17840 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
17860 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
17880 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17890 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
178a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
178b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
178c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
178d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
178e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
178f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17910 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17920 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
17930 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
17940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17950 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
17960 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
17970 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17980 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17990 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
179a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
179b0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
179c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
179d0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
179e0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
17a10 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17a30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17a40 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
17a50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17a60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17a70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
17a80 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17a90 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17aa0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17ac0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
17ad0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
17ae0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
17af0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
17b00 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
17b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17b20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
17b30 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
17b40 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17b50 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17b60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17b70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17b90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17ba0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
17bb0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17bc0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17bd0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17be0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17bf0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17c20 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17c30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
17c40 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17c50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
17c60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
17c70 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
17c80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
17c90 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
17ca0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17cb0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
17cc0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
17cd0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
17ce0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
17cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17d00 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
17d10 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17d20 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17d30 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17d40 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17d50 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17d60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17d70 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17d80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17d90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17db0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
17dc0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
17de0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
17df0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  );.          com
17e10 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
17e20 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
17e30 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  reak);.         
17e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17e60 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
17e70 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
17e80 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
17e90 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
17ea0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  );.          sel
17ec0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
17ed0 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62  rse, p, unionTab
17ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
17f00 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
17f10 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17f30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
17f40 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ont);.          
17f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f60 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
17f70 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
17f80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17fa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17fb0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
17fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17fe0 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
17ff0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
18000 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
18020 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
18030 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
18040 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  CT ); {.        
18050 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
18060 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
18070 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
18080 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  t;.        Expr 
18090 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  *pLimit;.       
180a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
180b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
180c0 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
180d0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a       int r1;.  .
180e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52          /* INTER
180f0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
18100 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
18110 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
18120 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  res.        ** t
18130 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
18140 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
18150 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
18160 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20    Begin.        
18170 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
18180 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
18190 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
181a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62    */.        tab
181b0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
181c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32  ++;.        tab2
181d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
181e0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
181f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
18200 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  0 );.  .        
18210 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18230 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18240 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b1, 0);.        
18250 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18260 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
18270 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18280 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
18290 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
182a0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
182b0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
182c0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
182d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
182e0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20  ->pEList );.  . 
182f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
18300 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
18310 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
18320 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
18330 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  1"..        */. 
18340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
18350 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
18360 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
18370 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
18380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18390 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
183a0 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
183b0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
183c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
183d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
183e0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
183f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
18400 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
18410 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
18420 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
18430 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
18440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64    */.        add
18450 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
18470 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
18480 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
18490 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
184a0 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
184b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
184c0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
184d0 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
184e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
184f0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
18500 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
18510 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
18520 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
18530 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
18540 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  b2;.        Expl
18550 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18560 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49  arse, 1, "%s USI
18570 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c  NG TEMP B-TREE",
18580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18590 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
185a0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
185b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
185c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
185d0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
185e0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ctdest);.       
185f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
18600 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
18610 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
18620 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
18630 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
18640 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
18650 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
18660 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
18670 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
18680 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
18690 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
186a0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
186b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
186c0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
186d0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70  imit);.        p
186e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
186f0 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  t;.  .        /*
18700 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18710 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
18720 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
18730 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
18740 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
18750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18760 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
18770 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
18780 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
18790 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
187a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
187b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
187c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
187d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  se);.        com
187e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
187f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
18800 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
18810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18820 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
18830 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
18840 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18850 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
18860 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18870 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18880 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
18890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
188a0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
188b0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
188c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
188d0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
188e0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
188f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
18900 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18920 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18930 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
18940 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
18950 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
18960 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18970 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
18980 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
18990 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
189a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
189b0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
189c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
189e0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
189f0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
18a00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18a20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
18a30 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18a50 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
18a60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18a80 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18a90 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18aa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18ab0 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18ad0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
18ae0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
18af0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18b00 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
18b10 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
18b20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
18b30 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18b40 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
18b50 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
18b60 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
18b70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
18b80 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18b90 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18ba0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18bb0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18bc0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18bd0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18be0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18bf0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18c00 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18c10 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18c20 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18c30 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18c40 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18c50 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18c60 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18c70 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18c80 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18c90 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18ca0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18cb0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18cc0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18cd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18ce0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18cf0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18d20 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18d30 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18d40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18d50 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18d60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18d70 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18d80 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18d90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18da0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18db0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18dc0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18dd0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18de0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18df0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18e00 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18e10 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18e40 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18e50 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18e60 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18e70 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18e80 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18e90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18ea0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18eb0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18ec0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18ed0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18ee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18ef0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18f00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18f20 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18f30 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18f40 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18f50 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18f60 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18f70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18f80 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18f90 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18fa0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18fb0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18fd0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18fe0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18ff0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
19000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
19010 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
19020 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
19030 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
19040 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
19050 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
19060 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
19070 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
19080 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
19090 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
190a0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
190b0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
190c0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
190d0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
190e0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
190f0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
19100 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
19110 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
19120 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19140 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
19150 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
19160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19170 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
19180 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19190 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
191a0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
191d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
191e0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
191f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19200 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
19210 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
19220 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
19230 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
19240 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
19250 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
19260 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
19270 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
19280 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19290 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
192a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
192b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
192c0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
192d0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
192e0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
192f0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
19300 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
19310 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
19320 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
19330 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
19340 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
19350 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
19360 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19370 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
19380 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
19390 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
193a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
193b0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
193c0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
193d0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
193e0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
193f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19410 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
19420 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
19430 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
19440 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
19450 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
19460 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
19470 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
19480 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
19490 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
194a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
194b0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
194c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
194d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
194e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
194f0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
19500 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
19510 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
19520 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
19530 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
19540 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
19550 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
19560 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
19570 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
19580 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
19590 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
195a0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
195b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
195c0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
195d0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
195e0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
195f0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
19600 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
19610 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
19620 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
19630 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
19640 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
19650 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
19660 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
19670 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19680 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
19690 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
196a0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
196b0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
196c0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
196d0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
196e0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
196f0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
19700 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
19710 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
19720 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
19730 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
19740 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
19750 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19760 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
19770 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19780 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19790 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
197c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
197d0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
197e0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
197f0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
19800 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
19810 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
19820 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
19830 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
19840 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
19850 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
19860 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
19870 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
19880 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
19890 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
198a0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
198b0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
198c0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
198d0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
198e0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
198f0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
19900 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
19910 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
19920 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
19930 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
19940 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
19950 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19960 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
19970 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
19980 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
19990 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
199a0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
199b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
199c0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
199d0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
199e0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
199f0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
19a00 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
19a10 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
19a20 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
19a30 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
19a40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19a50 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
19a60 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
19a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19a80 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
19a90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19aa0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
19ab0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
19ac0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19af0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19b00 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
19b10 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
19b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b30 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19b40 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
19b50 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
19b60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19b80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
19bb0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
19bc0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
19bd0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
19be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19bf0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19c00 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
19c10 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19c20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19c30 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
19c40 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
19c50 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
19c60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
19c70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
19c80 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
19c90 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
19ca0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
19cb0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19cc0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
19cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
19ce0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
19cf0 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
19d00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
19d10 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
19d20 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
19d30 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
19d40 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
19d50 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
19d60 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
19d70 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19d80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19d90 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
19da0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19db0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19dd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
19de0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
19df0 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
19e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19e20 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
19e30 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
19e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e50 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
19e60 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
19e70 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
19e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19e90 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ea0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
19eb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19ec0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
19ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19ee0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19ef0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
19f00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
19f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19f20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19f30 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
19f40 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
19f50 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
19f60 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
19f70 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
19f80 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
19f90 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
19fa0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
19fb0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
19fc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19fd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ff0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
1a000 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
1a010 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
1a020 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
1a030 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
1a040 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a060 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
1a070 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
1a080 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  arm, r1,.       
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20      pIn->iSdst, 
1a0b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a0c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a0d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a0e0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
1a0f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1a100 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
1a110 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
1a120 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
1a130 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
1a140 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
1a150 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
1a160 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
1a170 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
1a180 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
1a190 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
1a1a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a1b0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
1a1c0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
1a1d0 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
1a1e0 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
1a1f0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
1a200 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
1a210 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1a220 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a230 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
1a240 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
1a250 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
1a260 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
1a270 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
1a280 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
1a290 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1a2a0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1a2b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a2c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
1a2d0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1a2e0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
1a2f0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
1a300 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
1a310 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
1a320 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
1a330 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
1a340 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
1a350 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
1a360 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
1a370 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
1a380 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
1a390 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a3a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
1a3b0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a3c0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
1a3d0 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
1a3e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1a3f0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
1a400 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
1a410 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
1a420 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a440 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
1a450 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
1a460 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
1a470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a480 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
1a490 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1a4a0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
1a4b0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
1a4c0 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
1a4d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
1a4e0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
1a4f0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
1a500 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
1a510 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
1a520 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
1a530 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
1a540 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
1a550 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
1a560 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a570 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a580 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
1a590 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
1a5a0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
1a5b0 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
1a5c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
1a5d0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
1a5e0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
1a5f0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
1a600 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
1a620 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1a630 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
1a640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a650 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
1a660 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
1a670 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a690 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
1a6a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
1a6b0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
1a6c0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
1a6d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
1a6e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a700 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
1a710 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
1a720 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a730 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
1a740 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
1a750 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
1a760 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a770 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1a780 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
1a790 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a7a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
1a7b0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
1a7c0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1a7d0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
1a7e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
1a7f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
1a800 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
1a810 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
1a820 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
1a830 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
1a840 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
1a850 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
1a860 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
1a870 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
1a880 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
1a890 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
1a8a0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
1a8b0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
1a8c0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
1a8d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a8e0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
1a8f0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
1a900 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
1a910 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
1a920 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a930 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
1a940 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
1a950 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
1a960 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
1a970 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
1a980 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
1a990 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
1a9a0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
1a9b0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
1a9c0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
1a9d0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
1a9e0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
1a9f0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
1aa00 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aa10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
1aa20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aa30 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aa40 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aa50 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
1aa60 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
1aa70 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1aa80 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
1aa90 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aaa0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1aab0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1aac0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1aad0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
1aae0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
1aaf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1ab00 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
1ab10 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
1ab20 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
1ab30 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
1ab40 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
1ab50 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
1ab60 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
1ab70 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ab80 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ab90 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aba0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
1abb0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
1abc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
1abd0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
1abe0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
1abf0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
1ac00 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1ac10 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1ac20 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1ac30 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
1ac40 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
1ac50 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
1ac60 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
1ac70 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
1ac80 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
1ac90 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
1aca0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
1acb0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
1acc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1acd0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
1ace0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
1acf0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
1ad00 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
1ad10 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
1ad30 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
1ad40 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
1ad50 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
1ad60 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
1ad70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
1ad80 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
1ad90 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1ada0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1adb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
1adc0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
1add0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
1ade0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
1adf0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1ae00 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
1ae10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
1ae30 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
1ae40 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1ae50 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
1ae60 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae70 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ae80 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
1ae90 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
1aea0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
1aeb0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aec0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1aed0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
1aee0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1aef0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
1af00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1af10 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1af20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1af30 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
1af40 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
1af50 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
1af60 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
1af70 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
1af80 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
1af90 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1afa0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
1afb0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
1afc0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
1afd0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1afe0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
1aff0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
1b000 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
1b010 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
1b020 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
1b030 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
1b040 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
1b050 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1b060 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
1b070 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
1b080 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
1b090 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
1b0a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
1b0b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
1b0c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1b0d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
1b0e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
1b0f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
1b100 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
1b110 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
1b120 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
1b130 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
1b140 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
1b150 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
1b160 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
1b170 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
1b180 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
1b190 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1b1a0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
1b1b0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
1b1c0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
1b1d0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
1b1e0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
1b1f0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
1b200 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
1b210 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
1b220 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
1b230 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
1b240 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
1b250 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
1b260 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
1b270 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
1b280 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
1b290 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
1b2a0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
1b2b0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
1b2c0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
1b2d0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
1b2e0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
1b2f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
1b300 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
1b310 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
1b320 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
1b330 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
1b340 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
1b350 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
1b360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
1b370 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
1b380 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
1b390 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
1b3a0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
1b3b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b3c0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
1b3d0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
1b3e0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
1b3f0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
1b400 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
1b410 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
1b420 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
1b430 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
1b440 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
1b450 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
1b460 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
1b470 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
1b480 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
1b490 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
1b4a0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
1b4b0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
1b4c0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1b4d0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
1b4e0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
1b4f0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
1b500 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
1b510 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
1b520 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
1b530 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
1b540 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1b550 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
1b560 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
1b570 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
1b580 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b590 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1b5a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1b5b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1b5c0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b5d0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
1b5e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
1b5f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1b600 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1b610 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
1b620 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1b630 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b640 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b650 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
1b660 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
1b670 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
1b680 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
1b690 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
1b6a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1b6b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1b6c0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
1b6d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b6e0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
1b6f0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b700 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
1b710 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
1b720 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
1b730 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
1b740 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
1b750 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
1b760 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b770 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1b780 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
1b790 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
1b7a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b7b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b7c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b7d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b7e0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
1b7f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b800 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b810 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b820 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
1b830 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b840 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b850 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1b860 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
1b870 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b880 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
1b890 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b8a0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
1b8b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b8c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b8d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
1b8e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8f0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
1b900 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
1b960 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b970 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b990 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
1b9a0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
1b9b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b9c0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
1b9d0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
1b9e0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
1b9f0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1ba00 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
1ba10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1ba20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
1ba30 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
1ba40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1ba50 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
1ba60 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1ba70 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
1ba80 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ba90 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
1baa0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bab0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
1bac0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
1bad0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1bae0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
1baf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bb00 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
1bb10 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bb20 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bb30 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bb40 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
1bb50 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
1bb60 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
1bb70 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
1bb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
1bb90 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1bba0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
1bbb0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
1bbc0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
1bbd0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1bbe0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
1bbf0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
1bc00 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
1bc10 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1bc20 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
1bc30 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
1bc40 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1bc50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1bc60 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
1bc70 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
1bc80 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
1bc90 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
1bca0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
1bcb0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
1bcc0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
1bcd0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1bce0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
1bcf0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
1bd00 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
1bd30 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
1bd40 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
1bd50 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1bd60 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
1bd70 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
1bd80 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
1bd90 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
1bda0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
1bdb0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
1bdc0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bdd0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
1bde0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1bdf0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
1be00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1be10 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1be20 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
1be30 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1be40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
1be50 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1be60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1be70 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1be80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1be90 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
1bea0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
1beb0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
1bec0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
1bed0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
1bee0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
1bef0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
1bf00 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
1bf10 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
1bf20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
1bf30 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
1bf40 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1bf50 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
1bf60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1bf70 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1bf80 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
1bf90 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
1bfa0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
1bfb0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
1bfc0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1bfd0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1bfe0 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
1bff0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c000 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 0a  abel(pParse);...
1c010 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
1c020 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c030 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
1c040 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
1c050 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
1c060 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
1c070 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1c080 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1c090 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
1c0a0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
1c0b0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
1c0c0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
1c0d0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
1c0e0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
1c0f0 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
1c100 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
1c110 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
1c120 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
1c130 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
1c140 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
1c150 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
1c160 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c170 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
1c180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
1c190 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
1c1a0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
1c1b0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
1c1c0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
1c1d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c1e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c1f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c200 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1c210 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
1c220 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
1c230 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c240 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c250 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c260 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
1c270 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c280 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
1c290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c2a0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
1c2b0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
1c2c0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
1c2d0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
1c2e0 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
1c2f0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c310 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1c320 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1c330 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
1c340 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
1c350 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
1c360 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1c370 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
1c380 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1c390 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
1c3a0 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
1c3b0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
1c3c0 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
1c3d0 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
1c3e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
1c3f0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
1c400 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
1c410 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
1c420 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
1c430 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
1c440 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
1c450 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
1c460 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
1c470 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
1c480 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
1c490 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
1c4a0 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
1c4b0 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
1c4c0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
1c4d0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
1c4e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1c4f0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
1c500 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
1c510 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
1c520 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
1c530 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
1c540 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
1c550 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
1c560 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
1c570 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
1c580 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
1c590 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72  eof(int)*(nOrder
1c5a0 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20  By + 1));.  if( 
1c5b0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
1c5c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c5d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c5e0 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e   aPermute[0] = n
1c5f0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72  OrderBy;.    for
1c600 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=1, pItem=pOrd
1c610 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64  erBy->a; i<=nOrd
1c620 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
1c630 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1c640 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c650 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c670 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c680 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
1c690 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c6a0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
1c6b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c6c0 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
1c6d0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
1c6e0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1c6f0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
1c700 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
1c710 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1c720 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1c730 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
1c740 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
1c750 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1c760 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1c770 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
1c780 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
1c790 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1c7a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
1c7b0 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
1c7c0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
1c7d0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
1c7e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
1c7f0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
1c800 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
1c810 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
1c820 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
1c830 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
1c840 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
1c850 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
1c860 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
1c870 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
1c880 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1c890 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
1c8a0 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
1c8b0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
1c8c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
1c8d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1c8e0 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
1c8f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1c900 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
1c910 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
1c920 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
1c930 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
1c940 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1c950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c960 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
1c970 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
1c980 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
1c990 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
1c9a0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
1c9b0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
1c9c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
1c9d0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
1c9e0 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
1c9f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
1ca00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1ca10 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
1ca20 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
1ca30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
1ca40 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
1ca50 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
1ca60 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
1ca70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ca80 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
1ca90 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
1caa0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
1cab0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
1cac0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
1cad0 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
1cae0 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
1caf0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1cb00 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1cb10 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
1cb20 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
1cb30 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
1cb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1cb50 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
1cb60 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1cb70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1cb80 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
1cb90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1cba0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
1cbb0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
1cbc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1cbd0 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
1cbe0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
1cbf0 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
1cc00 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
1cc10 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1cc20 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
1cc30 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1cc40 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1cc50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc60 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
1cc70 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
1cc80 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
1ccc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ccd0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
1cce0 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
1ccf0 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
1cd00 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
1cd10 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
1cd20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1cd30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
1cd40 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
1cd50 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
1cd60 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cd70 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
1cd80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1cd90 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
1cda0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cdb0 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
1cdc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1cdd0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1cde0 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
1cdf0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1ce00 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1ce10 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ce20 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
1ce30 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1ce40 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1ce50 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45  ((pParse, 1, "ME
1ce60 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63  RGE (%s)", selec
1ce70 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
1ce80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ce90 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1cea0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1ceb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
1cec0 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
1ced0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
1cee0 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
1cef0 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
1cf00 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
1cf10 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1cf20 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1cf30 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1cf40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cf50 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1cf60 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
1cf70 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
1cf80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
1cf90 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
1cfa0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
1cfb0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70  regLimitA;.  Exp
1cfc0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
1cfd0 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22  Parse, 1, "LEFT"
1cfe0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ));.  sqlite3Sel
1cff0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
1d000 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
1d010 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1d020 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1d030 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
1d040 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1d050 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  dr1);..  /* Gene
1d060 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1d070 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d090 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
1d0a0 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
1d0b0 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
1d0c0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
1d0d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1d0e0 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1d0f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1d100 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1d110 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1d120 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
1d130 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
1d140 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
1d150 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
1d160 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
1d170 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
1d180 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
1d190 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
1d1a0 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
1d1b0 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45  ffset = 0;  .  E
1d1c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1d1d0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47  (pParse, 1, "RIG
1d1e0 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  HT"));.  sqlite3
1d1f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1d200 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
1d210 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
1d220 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
1d230 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
1d240 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1d250 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1d260 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
1d270 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d280 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1d290 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1d2a0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
1d2b0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1d2c0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1d2d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1d2e0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
1d2f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d300 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
1d310 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
1d320 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
1d330 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1d340 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d350 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1d360 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
1d370 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
1d380 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1d390 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1d3a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
1d3b0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d3c0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1d3d0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1d3e0 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
1d3f0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1d400 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1d410 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d430 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1d440 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
1d450 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d460 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1d470 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
1d480 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
1d490 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1d4a0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1d4c0 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
1d4d0 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
1d4e0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1d4f0 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1d500 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lEnd);.  }.  sql
1d510 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
1d520 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a  (pKeyDup);..  /*
1d530 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d540 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d550 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d560 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
1d570 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d580 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d590 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
1d5a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d5b0 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
1d5c0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d5d0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  ){.    addrEofA_
1d5e0 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d  noB = addrEofA =
1d5f0 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c   labelEnd;.  }el
1d600 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1d610 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1d620 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
1d630 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  ));.    addrEofA
1d640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d650 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d660 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1d670 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  utB);.    addrEo
1d680 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33  fA_noB = sqlite3
1d690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d6a0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1d6b0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1d6f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d700 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1d710 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  fA);.    p->nSel
1d720 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
1d730 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
1d740 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
1d750 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
1d760 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d770 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d780 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d790 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d7a0 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
1d7b0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d7c0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
1d7d0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d7e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1d7f0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d800 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
1d810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65  ;.    if( p->nSe
1d820 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72  lectRow > pPrior
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
1d840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
1d850 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d860 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  w;.  }else{  .  
1d870 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d880 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
1d890 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1d8a0 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
1d8b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d8c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d8d0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d8f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d900 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c   regAddrA, label
1d910 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
1d920 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1d930 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1d940 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
1d950 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d960 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1d970 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
1d980 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d990 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
1d9a0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1d9b0 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
1d9c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d9d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d9e0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
1d9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da00 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1da10 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1da20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1da30 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1da40 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1da50 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
1da60 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1da70 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1da80 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
1da90 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1daa0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1dab0 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
1dac0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1dad0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
1dae0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1daf0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
1db00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
1db10 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1db20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
1db30 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
1db40 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
1db50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1db60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1db70 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1db80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1db90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1dba0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1dbb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1dbc0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1dbd0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1dbe0 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
1dbf0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1dc00 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
1dc10 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
1dc20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1dc30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1dc40 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1dc50 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1dc60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1dc70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1dc80 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1dc90 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
1dca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dcb0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1dcc0 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1dcd0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dce0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dcf0 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1dd00 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1dd10 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1dd20 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1dd30 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1dd40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1dd50 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
1dd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dd70 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dd80 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dd90 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76  fA_noB); VdbeCov
1dda0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1ddb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ddc0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ddd0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1dde0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ddf0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
1de00 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
1de10 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
1de20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1de30 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
1de40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1de50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
1de60 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
1de70 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
1de80 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
1de90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
1deb0 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
1dec0 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
1ded0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
1df00 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
1df10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1df20 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
1df30 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
1df40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1df50 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
1df60 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
1df70 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f  ddrAgtB); VdbeCo
1df80 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1df90 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
1dfa0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
1dfb0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1dfc0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1dfd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1dfe0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1dff0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73  End);..  /* Reas
1e000 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1e010 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1e020 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1e030 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1e040 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1e050 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1e060 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1e070 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1e080 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1e090 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1e0a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1e0b0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1e0c0 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1e0d0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1e0e0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1e0f0 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1e100 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1e110 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1e120 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  **/.  ExplainQue
1e130 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65  ryPlanPop(pParse
1e140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
1e150 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23  se->nErr!=0;.}.#
1e160 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1e170 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e180 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1e190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e1a0 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69  T_VIEW)../* An i
1e1b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53  nstance of the S
1e1c0 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65  ubstContext obje
1e1d0 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20  ct describes an 
1e1e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69  substitution edi
1e1f0 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f  t.** to be perfo
1e200 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20  rmed on a parse 
1e210 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  tree..**.** All 
1e220 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
1e230 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69  lumns in table i
1e240 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20  Table are to be 
1e250 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72  replaced by corr
1e260 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70  esponding.** exp
1e270 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69  ressions in pELi
1e280 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  st..*/.typedef s
1e290 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65  truct SubstConte
1e2a0 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  xt {.  Parse *pP
1e2b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1e2c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1e2d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e2e0 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20   iTable;        
1e2f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e300 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1e310 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
1e320 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20  int iNewTable;  
1e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1e340 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f   table number */
1e350 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
1e360 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1e370 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  Add TK_IF_NULL_R
1e380 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61  OW opcodes on ea
1e390 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a  ch replacement *
1e3a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1e3b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  List;         /*
1e3c0 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70   Replacement exp
1e3d0 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75  ressions */.} Su
1e3e0 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20  bstContext;../* 
1e3f0 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1e400 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1e410 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1e420 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1e430 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1e440 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1e450 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78  lect(SubstContex
1e460 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74  t*, Select*, int
1e470 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1e480 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1e490 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1e4a0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1e4b0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1e4c0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1e4d0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1e4e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1e4f0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1e500 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1e510 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1e520 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1e530 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1e540 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1e550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1e560 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1e570 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1e580 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1e590 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1e5a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1e5b0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1e5c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1e5d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e5e0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1e5f0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1e600 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1e610 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1e620 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1e630 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1e640 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
1e650 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1e660 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1e670 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1e680 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1e690 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1e6a0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1e6b0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1e6c0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1e6d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1e6e0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1e6f0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1e700 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72  Subst,  /* Descr
1e710 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e720 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e730 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1e740 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
1e750 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
1e760 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29  tion occurs */.)
1e770 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
1e780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1e790 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1e7a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
1e7b0 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78  mJoin).   && pEx
1e7c0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e7d0 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e7e0 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78  ble.  ){.    pEx
1e7f0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e800 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e810 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
1e820 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1e830 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
1e840 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1e850 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1e860 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1e870 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1e880 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1e890 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1e8a0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1e8b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70        Expr *pCop
1e8c0 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69  y = pSubst->pELi
1e8d0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1e8e0 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
1e8f0 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f     Expr ifNullRo
1e900 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1e910 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21   pSubst->pEList!
1e920 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1e930 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c  lumn<pSubst->pEL
1e940 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1e950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e960 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1e970 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e980 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1e990 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1e9a0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1e9b0 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1e9c0 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1e9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e9e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e9f0 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1ea00 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1ea10 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1ea20 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1ea30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1ea40 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1ea50 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1ea60 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1ea80 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1ea90 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1eaa0 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1eab0 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1eac0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ead0 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1eae0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1eaf0 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1eb00 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1eb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
1eb20 65 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73  estcase( ExprHas
1eb30 50 72 6f 70 65 72 74 79 28 70 43 6f 70 79 2c 20  Property(pCopy, 
1eb40 45 50 5f 53 75 62 71 75 65 72 79 29 20 29 3b 0a  EP_Subquery) );.
1eb50 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1eb60 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1eb70 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1eb80 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1eb90 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1eba0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1ebb0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ebc0 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1ebd0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ebf0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ec00 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1ec10 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1ec20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1ec30 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1ec40 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1ec50 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1ec60 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1ec70 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1ec80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ec90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1eca0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1ecb0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1ecc0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1ecd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ece0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1ecf0 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1ed00 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1ed10 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1ed20 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1ed30 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1ed40 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1ed50 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1ed60 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1ed70 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ed80 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1ed90 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1eda0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1edb0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1edc0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1edd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ede0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1edf0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1ee00 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ee10 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1ee20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ee30 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ee40 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1ee50 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ee60 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ee70 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee80 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1ee90 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1eea0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1eeb0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1eec0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1eed0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1eee0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1eef0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1ef00 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1ef10 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1ef20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1ef30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1ef40 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ef50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ef60 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1ef70 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1ef80 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1ef90 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1efa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1efb0 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1efc0 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1efd0 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1efe0 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1eff0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1f000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1f010 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1f020 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1f030 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1f040 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1f050 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1f060 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1f070 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1f080 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1f090 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1f0a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f0b0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f0c0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1f0d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1f0e0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1f0f0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f100 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f110 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1f120 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1f130 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f140 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1f150 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1f160 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f170 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1f180 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1f190 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f1a0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1f1b0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1f1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f1d0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1f1e0 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1f1f0 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1f200 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1f210 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1f220 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1f230 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1f240 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f250 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1f260 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1f270 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1f280 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f2a0 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1f2b0 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1f2c0 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1f2d0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f2f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f300 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f310 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1f320 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f330 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f340 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f350 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1f360 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f370 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1f380 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1f390 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1f3a0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1f3b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f3c0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1f3d0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1f3e0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1f3f0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1f400 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1f410 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1f420 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1f430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1f440 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1f450 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1f460 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1f470 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1f480 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1f490 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1f4a0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1f4b0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1f4c0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1f4d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1f4e0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1f4f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1f500 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f510 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1f520 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1f530 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1f540 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1f550 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1f560 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1f570 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1f580 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1f590 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1f5a0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1f5b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1f5c0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f5d0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1f5e0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1f5f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f600 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1f610 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1f620 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1f630 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1f640 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1f650 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1f660 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1f670 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1f680 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1f690 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1f6a0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1f6b0 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1f6c0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1f6d0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1f6e0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1f6f0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1f700 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1f710 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1f720 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1f730 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1f740 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1f750 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1f760 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1f770 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1f780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1f790 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1f7a0 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1f7b0 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1f7c0 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1f7d0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1f7e0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1f7f0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1f800 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1f810 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1f820 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1f830 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1f840 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1f850 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1f860 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1f870 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1f880 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f890 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f8a0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f8b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f8c0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f8d0 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f8e0 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f8f0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f900 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f920 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1f930 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1f940 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1f950 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1f960 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1f970 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1f980 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1f990 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1f9a0 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1f9b0 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1f9c0 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1f9d0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1f9e0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f9f0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1fa00 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1fa10 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1fa20 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fa30 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1fa40 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1fa50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fa60 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1fa70 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1fa80 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1fa90 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1faa0 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1fab0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fac0 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1fad0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1fae0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1faf0 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1fb00 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1fb10 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1fb20 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1fb30 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1fb40 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1fb50 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1fb60 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1fb70 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1fb80 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1fb90 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1fba0 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1fbb0 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1fbc0 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1fbd0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1fbe0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1fbf0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1fc00 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1fc10 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1fc20 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1fc30 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1fc40 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc50 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fc60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fc70 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1fc80 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1fc90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1fca0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fcb0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1fcc0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1fcd0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1fce0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1fcf0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1fd00 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1fd10 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1fd20 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1fd30 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1fd40 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1fd50 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1fd60 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1fd70 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1fd80 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1fd90 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fda0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fdb0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fdc0 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1fdd0 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1fde0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fdf0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fe00 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fe10 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1fe20 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1fe30 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1fe40 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1fe50 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1fe60 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1fe70 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1fe80 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1fe90 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1fea0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1feb0 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1fec0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1fed0 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1fee0 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1fef0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1ff00 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1ff10 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1ff20 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1ff30 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ff40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ff50 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1ff60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ff70 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1ff80 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1ff90 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1ffa0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1ffb0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1ffc0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1ffd0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1ffe0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1fff0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
20000 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
20010 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
20020 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20030 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
20040 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
20050 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20060 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
20070 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
20080 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20090 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
200a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
200b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
200c0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
200d0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
200e0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
200f0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
20100 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
20110 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
20120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20130 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
20140 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
20150 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20160 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
20170 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
20180 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
20190 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
201a0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
201b0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
201c0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
201d0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
201e0 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
201f0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20200 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
20210 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
20220 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
20230 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
20240 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
20250 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
20260 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
20270 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20280 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
20290 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
202a0 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
202b0 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
202c0 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
202d0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
202e0 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
202f0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
20300 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
20310 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
20320 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20330 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20340 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
20350 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
20360 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
20370 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
20380 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
20390 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
203a0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
203b0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
203c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
203d0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
203e0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
203f0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
20400 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
20410 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
20420 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
20430 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
20440 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
20450 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
20460 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
20470 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
20480 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
20490 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
204a0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
204b0 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
204c0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
204d0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
204e0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
204f0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
20500 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
20510 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
20520 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
20530 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
20540 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
20550 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
20560 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
20570 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
20580 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
20590 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
205a0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
205b0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
205c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
205d0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
205e0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
205f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
20600 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
20610 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
20620 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
20630 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
20640 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
20650 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
20660 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
20670 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
20680 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
20690 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
206a0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
206b0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
206c0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
206d0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
206e0 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
206f0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
20700 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
20710 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
20720 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
20730 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
20740 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
20750 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20760 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20770 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20780 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
20790 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
207a0 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
207b0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
207c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
207d0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
207e0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
207f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
20800 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
20810 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
20820 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
20830 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
20840 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
20850 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
20860 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20870 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
20880 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20890 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
208a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
208b0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
208c0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
208d0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
208e0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
208f0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
20900 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
20910 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
20920 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20930 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20940 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
20950 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
20960 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
20970 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
20980 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20990 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
209a0 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
209b0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
209c0 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
209d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
209e0 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
209f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20a00 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
20a10 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
20a20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20a30 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
20a40 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
20a50 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
20a60 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
20a70 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
20a80 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20a90 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20aa0 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20ab0 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20ac0 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
20ad0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
20ae0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
20af0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
20b00 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
20b10 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
20b20 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
20b30 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
20b40 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
20b50 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20b60 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
20b70 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
20b80 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20b90 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20ba0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20bb0 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20bc0 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20bd0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20be0 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20bf0 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20c00 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20c10 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20c20 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
20c30 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
20c40 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
20c50 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28  ximal.).**.**  (
20c60 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74  25)  If either t
20c70 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74  he subquery or t
20c80 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20c90 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f  contains a windo
20ca0 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63  w.**        func
20cb0 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65  tion in the sele
20cc0 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52  ct list or ORDER
20cd0 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74   BY clause, flat
20ce0 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  tening.**       
20cf0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20d00 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  d..**.**.** In t
20d10 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
20d20 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
20d30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20d40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20d50 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
20d60 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
20d70 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
20d80 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
20d90 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
20da0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
20db0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20dc0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20dd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20de0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
20df0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
20e00 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
20e10 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
20e20 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
20e30 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
20e40 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
20e50 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
20e60 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
20e70 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
20e80 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
20e90 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
20ea0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
20eb0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
20ec0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
20ed0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
20ee0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20ef0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
20f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20f10 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
20f20 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20f30 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
20f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20f50 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
20f60 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
20f70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
20f80 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20  t isAgg         
20f90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
20fa0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
20fb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
20fc0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
20fd0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
20fe0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
20ff0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
21000 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
21010 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
21020 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
21030 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
21040 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
21050 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
21060 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21070 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
21080 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
21090 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
210a0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
210b0 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
210c0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
210d0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
210e0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
210f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21100 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
21110 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
21120 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21130 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
21140 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
21150 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
21160 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
21170 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
21180 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
21190 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
211a0 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20  wParent = -1;/* 
211b0 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c  Replacement tabl
211c0 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f  e for iParent */
211d0 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
211e0 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  n = 0; /* True i
211f0 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69  f pSub is the ri
21200 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45  ght side of a LE
21210 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20  FT JOIN */    . 
21220 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21240 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
21250 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
21260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21270 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21280 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21290 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
212a0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
212b0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
212c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
212d0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
212e0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
212f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
21300 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
21310 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
21320 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
21330 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
21340 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69  =0 );.  if( Opti
21350 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
21360 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
21370 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
21380 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
21390 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
213a0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
213b0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
213c0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
213d0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
213e0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
213f0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
21400 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
21410 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
21420 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
21430 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  Sub!=0 );..#ifnd
21440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
21450 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
21460 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d  p->pWin || pSub-
21470 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
21480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21490 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
214a0 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66  n (25) */.#endif
214b0 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
214c0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
214d0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
214e0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
214f0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
21500 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21510 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
21520 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
21530 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
21540 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21550 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
21560 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
21570 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
21580 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
21590 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
215a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
215b0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
215c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
215d0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
215e0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
215f0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
21600 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
21610 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
21620 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
21630 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21640 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
21650 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21660 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21670 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
21680 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21690 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69  Sub->pLimit->pRi
216a0 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ght ) return 0; 
216b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
216c0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
216d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
216e0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
216f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
21700 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21740 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
21750 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
21760 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
21770 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21790 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
217a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
217b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
217c0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
217d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
217e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
217f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21800 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
21810 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
21820 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
21830 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21840 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
21850 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
21860 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
21870 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21880 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
218c0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
218d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
218e0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
218f0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21910 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21920 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
21930 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
21940 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
21950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21960 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21970 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
21980 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
21990 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
219a0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
219b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
219c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
219d0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
219e0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
219f0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
21a00 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
21a10 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
21a20 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
21a30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
21a40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21a50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21a60 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21a70 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
21a80 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
21a90 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
21aa0 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65  lf (3a). Example
21ab0 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
21ac0 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  not.  ** allowed
21ad0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
21ae0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
21af0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
21b00 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
21b10 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
21b20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
21b30 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
21b40 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
21b50 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
21b60 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
21b70 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
21b80 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
21b90 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
21ba0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21bb0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21bc0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21bd0 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  N, then the oute
21be0 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e  r.  ** query can
21bf0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
21c00 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20  ate. (3c)  This 
21c10 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f  is an artifact o
21c20 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61  f the way.  ** a
21c30 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72  ggregates are pr
21c40 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20  ocessed - there 
21c50 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20  is no mechanism 
21c60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a  to determine if.
21c70 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f    ** the LEFT JO
21c80 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  IN table should 
21c90 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a  be all-NULL..  *
21ca0 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20  *.  ** See also 
21cb0 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33  tickets #306, #3
21cc0 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20  50, and #3300.. 
21cd0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
21ce0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21cf0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
21d00 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  ){.    isLeftJoi
21d10 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  n = 1;.    if( p
21d20 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c  SubSrc->nSrc>1 |
21d30 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72  | isAgg || IsVir
21d40 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b  tual(pSubSrc->a[
21d50 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
21d60 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20    /*  (3a)      
21d70 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20         (3c)     
21d80 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  (3b) */.      re
21d90 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21da0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21db0 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
21dc0 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
21dd0 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
21de0 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
21df0 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
21e00 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
21e10 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
21e20 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
21e30 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
21e40 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
21e50 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
21e60 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
21e70 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  oin, even.    **
21e80 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
21e90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
21ea0 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
21eb0 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
21ec0 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20  NullRow .    ** 
21ed0 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  opcode. */.    i
21ee0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a  sLeftJoin = -1;.
21ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
21f00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   Restriction (17
21f10 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  ): If the sub-qu
21f20 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21f30 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
21f40 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
21f50 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
21f60 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
21f70 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
21f80 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
21f90 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
21fa0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
21fb0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
21fc0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
21fd0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
21fe0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
21ff0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
22000 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
22010 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
22020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22030 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
22040 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20  ion (20) */.    
22050 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
22060 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
22070 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
22080 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
22090 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
220a0 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c  rn 0; /* (17d1),
220b0 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64   (17d2), or (17d
220c0 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  3) */.    }.    
220d0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
220e0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
220f0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
22100 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22110 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22120 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22130 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22140 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22150 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22160 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22170 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22180 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
22190 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
221a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
221b0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
221c0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
221e0 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
221f0 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
22200 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
22210 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
22220 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
22230 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f  0    /* (17b) */
22240 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
22250 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
22260 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20  /* (17a) */.    
22290 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
222a0 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20  c->nSrc<1       
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
222d0 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a  7c) */.      ){.
222e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
222f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22300 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
22310 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
22320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
22330 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e  estriction (18).
22340 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
22350 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
22360 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
22370 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
22380 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
22390 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
223a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
223b0 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
223c0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
223d0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
223e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d   }.  }..  /* Ex-
223f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  restriction (23)
22400 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  :.  ** The only 
22410 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63  way that the rec
22420 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
22430 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e   CTE can contain
22440 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a   a compound.  **
22450 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72   subquery is for
22460 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
22470 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   be one term of 
22480 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
22490 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
224a0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65  y is a join, the
224b0 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  n the flattening
224c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
224d0 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a  n stopped by.  *
224e0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * restriction (1
224f0 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  7d3).  */.  asse
22500 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
22510 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
22520 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72  ==0 || pSub->pPr
22530 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a  ior==0 );..  /**
22540 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
22550 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
22560 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
22570 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
22580 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
22590 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
225a0 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  u.%p from term %
225b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
225c0 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73           pSub->s
225d0 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f  elId, pSub, iFro
225e0 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
225f0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
22600 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
22610 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
22620 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
22630 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
22640 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
22650 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
22660 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
22670 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
22680 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
22690 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
226a0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
226b0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
226c0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
226d0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
226e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
226f0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
22700 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
22710 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
22720 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
22730 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
22740 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
22750 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
22760 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
22770 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
22780 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
22790 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
227a0 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
227b0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
227c0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
227d0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
227e0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
227f0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
22800 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
22810 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
22820 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
22830 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
22840 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
22850 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
22860 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
22870 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
22880 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
22890 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
228a0 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
228b0 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
228c0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
228d0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
228e0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
228f0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
22900 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
22910 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
22920 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
22930 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
22940 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
22950 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22960 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22970 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
22980 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
22990 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
229a0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
229b0 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
229c0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
229d0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
229e0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
229f0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
22a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22a10 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
22a20 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
22a30 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22a40 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22a50 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
22a60 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
22a70 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22a80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22a90 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
22aa0 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
22ab0 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
22ac0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
22ad0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
22ae0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
22af0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22b00 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
22b10 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
22b20 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
22b30 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
22b40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
22b50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
22b60 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
22b70 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
22b80 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
22b90 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
22ba0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
22bb0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
22bc0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
22bd0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
22be0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22bf0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
22c00 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
22c10 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
22c20 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
22c30 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
22c40 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22c50 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
22c60 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
22c70 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
22c80 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
22c90 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
22ca0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22cc0 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
22cd0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
22ce0 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
22cf0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
22d00 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
22d10 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
22d20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
22d30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
22d40 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(2,pParse,p,(
22d50 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22d60 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20  ry flattener".  
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72              " cr
22d90 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72  eates %u as peer
22da0 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29  \n",pNew->selId)
22db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22dc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22dd0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22de0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22df0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22e00 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22e10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22e20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22e30 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22e40 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22e50 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22e60 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
22e70 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
22e80 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
22e90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22ea0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
22eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22ec0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22ed0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22ef0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22f00 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22f10 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22f20 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22f30 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22f40 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22f50 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
22f60 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
22f70 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f80 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
22f90 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
22fa0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
22fb0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22fc0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22fd0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22fe0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22ff0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
23000 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
23010 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
23020 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
23030 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
23040 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
23050 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
23060 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
23070 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
23080 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
23090 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
230a0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
230b0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
230c0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
230d0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
230e0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
230f0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
23100 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
23110 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
23120 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
23130 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
23140 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23150 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23160 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23170 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
23180 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
23190 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
231a0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
231b0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
231c0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
231d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
231e0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
231f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
23200 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
23210 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
23220 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
23230 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
23240 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
23250 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
23260 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
23270 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
23280 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
23290 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
232a0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
232b0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
232c0 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
232d0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
232e0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
232f0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
23300 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
23310 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
23320 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
23330 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
23340 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
23350 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23360 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
23370 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23380 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
23390 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
233a0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
233b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
233c0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
233d0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
233e0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
233f0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
23400 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
23410 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
23420 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
23430 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
23440 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
23450 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
23460 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
23470 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
23480 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
23490 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
234a0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
234b0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
234c0 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
234d0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
234e0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
234f0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
23500 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
23510 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
23520 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
23530 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
23540 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
23550 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
23560 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
23570 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23580 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
23590 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
235a0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
235b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
235c0 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
235d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
235e0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
235f0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
23600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23610 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23620 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
23630 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23640 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
23650 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
23660 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
23670 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
23680 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
23690 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
236a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
236b0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
236c0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
236d0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
236e0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
236f0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
23700 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
23710 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
23720 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
23730 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b   pSrc==0 ) break
23740 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23750 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
23760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
23770 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
23780 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
23790 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
237a0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
237b0 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
237c0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
237d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
237e0 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
237f0 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
23800 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
23810 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
23820 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
23830 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
23840 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
23850 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
23870 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23880 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23890 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
238a0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
238b0 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
238c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
238d0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
238e0 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
238f0 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
23900 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
23910 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
23920 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
23930 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
23940 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
23950 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
23960 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
23970 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
23980 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23990 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
239a0 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
239b0 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
239c0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
239d0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
239e0 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
239f0 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
23a00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23a10 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
23a20 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23a30 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
23a40 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
23a50 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23a60 65 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  e(pParse, pSrc, 
23a70 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
23a80 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  1);.      if( pS
23a90 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rc==0 ) break;. 
23aa0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23ab0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d  rc = pSrc;.    }
23ac0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
23ad0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
23ae0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
23af0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
23b00 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
23b10 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23b30 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23b40 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23b50 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23b60 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23b70 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23b80 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23b90 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23bb0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23bc0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23bd0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23be0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23bf0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23c00 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23c10 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23c20 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23c30 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23c40 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23c50 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23c60 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23c70 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23c80 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23c90 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23ca0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23cb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23cc0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23cd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23ce0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23cf0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23d00 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23d10 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23d20 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23d30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23d40 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23d50 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23d60 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23d70 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23d80 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23d90 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23da0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23db0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23dc0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23de0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23df0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23e00 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23e10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23e20 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23e30 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23e40 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23e50 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23e60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23e70 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23e80 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23e90 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23ea0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23eb0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23ec0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23ed0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23ee0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23ef0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23f00 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23f10 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23f20 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23f30 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23f40 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23f50 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23f60 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23f70 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23f80 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23f90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23fa0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23fb0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23fc0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23fd0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23fe0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ff0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
24000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
24010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24020 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
24030 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
24040 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
24050 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
24060 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
24070 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
24080 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
24090 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
240a0 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
240b0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
240c0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
240d0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
240e0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
240f0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
24100 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
24110 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24120 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24130 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24140 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24150 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24160 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24170 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24190 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
241a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
241b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
241c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
241d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
241e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
241f0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
24200 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
24210 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24220 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24230 3d 20 70 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a  = pSub->pWhere;.
24240 20 20 20 20 70 53 75 62 2d 3e 70 57 68 65 72 65      pSub->pWhere
24250 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73   = 0;.    if( is
24260 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
24270 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
24280 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
24290 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
242a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
242b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
242c0 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
242d0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29  pParent->pWhere)
242e0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
242f0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
24300 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
24310 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70  ext x;.      x.p
24320 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
24330 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
24340 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   iParent;.      
24350 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e  x.iNewTable = iN
24360 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
24370 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69  x.isLeftJoin = i
24380 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20  sLeftJoin;.     
24390 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
243a0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
243b0 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20  substSelect(&x, 
243c0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  pParent, 0);.   
243d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
243e0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
243f0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
24400 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
24410 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
24420 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
24430 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
24440 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
24450 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
24460 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
24470 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
24480 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
24490 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
244a0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
244b0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
244c0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
244d0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
244e0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
244f0 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
24500 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
24510 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
24520 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
24530 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
24540 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
24550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
24560 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
24570 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
24580 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
24590 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
245a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
245b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
245c0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
245d0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
245e0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
245f0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
24600 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
24610 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24620 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
24630 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
24640 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
24650 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
24660 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
24670 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
24680 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
24690 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
246a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
246b0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
246c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
246d0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
246e0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
246f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24700 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
24710 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
24720 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20  EW) */../*.** A 
24730 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b 65 65  structure to kee
24740 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f  p track of all o
24750 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
24760 75 65 73 20 74 68 61 74 20 61 72 65 20 66 69 78  ues that are fix
24770 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e  ed to.** a known
24780 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20 57 48   value due to WH
24790 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
247a0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
247b0 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e  rm COLUMN=VALUE.
247c0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
247d0 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 57 68  ct WhereConst Wh
247e0 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74  ereConst;.struct
247f0 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20   WhereConst {.  
24800 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
24810 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24820 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ext */.  int nCo
24830 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  nst;      /* Num
24840 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43  ber for COLUMN=C
24850 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f  ONSTANT terms */
24860 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20  .  int nChng;   
24870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24880 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e   times a constan
24890 74 20 69 73 20 70 72 6f 70 61 67 61 74 65 64 20  t is propagated 
248a0 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70 45 78  */.  Expr **apEx
248b0 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69  pr;   /* [i*2] i
248c0 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a  s COLUMN and [i*
248d0 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f  2+1] is VALUE */
248e0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .};../*.** Add a
248f0 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
24900 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e  e pConst object.
24910 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
24920 20 61 64 64 20 64 75 70 6c 69 63 61 74 65 0a 2a   add duplicate.*
24930 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65  * pColumn entire
24940 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
24950 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20  d constInsert(. 
24960 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f   WhereConst *pCo
24970 6e 73 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  nst,      /* The
24980 20 57 68 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f   WhereConst into
24990 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e   which we are in
249a0 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70  serting */.  Exp
249b0 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *pColumn,     
249c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c        /* The COL
249d0 55 4d 4e 20 70 61 72 74 20 6f 66 20 74 68 65 20  UMN part of the 
249e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
249f0 45 78 70 72 20 2a 70 56 61 6c 75 65 20 20 20 20  Expr *pValue    
24a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24a10 56 41 4c 55 45 20 70 61 72 74 20 6f 66 20 74 68  VALUE part of th
24a20 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
24a30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
24a40 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f  sert( pColumn->o
24a50 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
24a60 0a 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35  .  /* 2018-10-25
24a70 20 74 69 63 6b 65 74 20 5b 63 66 35 65 64 32 30   ticket [cf5ed20
24a80 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72  f].  ** Make sur
24a90 65 20 74 68 65 20 73 61 6d 65 20 70 43 6f 6c 75  e the same pColu
24aa0 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65 72 74  mn is not insert
24ab0 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
24ac0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
24ad0 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  i<pConst->nConst
24ae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
24af0 74 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  t Expr *pExpr = 
24b00 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69  pConst->apExpr[i
24b10 2a 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  *2];.    assert(
24b20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
24b30 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28  OLUMN );.    if(
24b40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
24b50 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a  pColumn->iTable.
24b60 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
24b70 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d  Column==pColumn-
24b80 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >iColumn.    ){.
24b90 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f        return;  /
24ba0 2a 20 41 6c 72 65 61 64 79 20 70 72 65 73 65 6e  * Already presen
24bb0 74 2e 20 20 52 65 74 75 72 6e 20 77 69 74 68 6f  t.  Return witho
24bc0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
24bd0 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  g. */.    }.  }.
24be0 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73  .  pConst->nCons
24bf0 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61  t++;.  pConst->a
24c00 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44  pExpr = sqlite3D
24c10 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
24c20 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Const->pParse->d
24c30 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  b, pConst->apExp
24c40 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
24c50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e              pCon
24c60 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a  st->nConst*2*siz
24c70 65 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20 20 69  eof(Expr*));.  i
24c80 66 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  f( pConst->apExp
24c90 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e  r==0 ){.    pCon
24ca0 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a  st->nConst = 0;.
24cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
24cc0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
24cd0 28 70 56 61 6c 75 65 2c 20 45 50 5f 46 69 78 65  (pValue, EP_Fixe
24ce0 64 43 6f 6c 29 20 29 20 70 56 61 6c 75 65 20 3d  dCol) ) pValue =
24cf0 20 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a   pValue->pLeft;.
24d00 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78      pConst->apEx
24d10 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73  pr[pConst->nCons
24d20 74 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e  t*2-2] = pColumn
24d30 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ;.    pConst->ap
24d40 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f  Expr[pConst->nCo
24d50 6e 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75  nst*2-1] = pValu
24d60 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
24d70 46 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f  Find all terms o
24d80 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f  f COLUMN=VALUE o
24d90 72 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69  r VALUE=COLUMN i
24da0 6e 20 70 45 78 70 72 20 77 68 65 72 65 20 56 41  n pExpr where VA
24db0 4c 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73  LUE.** is a cons
24dc0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
24dd0 61 6e 64 20 77 68 65 72 65 20 74 68 65 20 74 65  and where the te
24de0 72 6d 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  rm must be true 
24df0 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
24e00 20 70 61 72 74 20 6f 66 20 74 68 65 20 41 4e 44   part of the AND
24e10 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
24e20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
24e30 6f 6e 2e 20 20 46 6f 72 20 65 61 63 68 20 74 65  on.  For each te
24e40 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64  rm.** found, add
24e50 20 69 74 20 74 6f 20 74 68 65 20 70 43 6f 6e 73   it to the pCons
24e60 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
24e70 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 64  static void find
24e80 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 57 68 65  ConstInWhere(Whe
24e90 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c  reConst *pConst,
24ea0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
24eb0 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
24ec0 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 70 45 78  pLeft;.  if( pEx
24ed0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
24ee0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24ef0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24f00 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
24f10 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
24f20 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
24f30 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68     findConstInWh
24f40 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70  ere(pConst, pExp
24f50 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
24f60 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24f70 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24f80 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75  pLeft);.    retu
24f90 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  rn;.  }.  if( pE
24fa0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29  xpr->op!=TK_EQ )
24fb0 20 72 65 74 75 72 6e 3b 0a 20 20 70 52 69 67 68   return;.  pRigh
24fc0 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
24fd0 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78  t;.  pLeft = pEx
24fe0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73  pr->pLeft;.  ass
24ff0 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
25000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
25010 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  t!=0 );.  if( pR
25020 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
25030 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48  UMN.   && !ExprH
25040 61 73 50 72 6f 70 65 72 74 79 28 70 52 69 67 68  asProperty(pRigh
25050 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a  t, EP_FixedCol).
25060 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25070 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66  rIsConstant(pLef
25080 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t).   && sqlite3
25090 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33  IsBinary(sqlite3
250a0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
250b0 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61  lSeq(pConst->pPa
250c0 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74  rse,pLeft,pRight
250d0 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )).  ){.    cons
250e0 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20  tInsert(pConst, 
250f0 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a  pRight, pLeft);.
25100 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4c    }else.  if( pL
25110 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
25120 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  MN.   && !ExprHa
25130 73 50 72 6f 70 65 72 74 79 28 70 4c 65 66 74 2c  sProperty(pLeft,
25140 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20   EP_FixedCol).  
25150 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
25160 73 43 6f 6e 73 74 61 6e 74 28 70 52 69 67 68 74  sConstant(pRight
25170 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49  ).   && sqlite3I
25180 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42  sBinary(sqlite3B
25190 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
251a0 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Seq(pConst->pPar
251b0 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29  se,pLeft,pRight)
251c0 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
251d0 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70  Insert(pConst, p
251e0 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
251f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25200 20 69 73 20 61 20 57 61 6c 6b 65 72 20 65 78 70   is a Walker exp
25210 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ression callback
25220 2e 20 20 70 45 78 70 72 20 69 73 20 61 20 63 61  .  pExpr is a ca
25230 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69  ndidate expressi
25240 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  on.** to be repl
25250 61 63 65 64 20 62 79 20 61 20 76 61 6c 75 65 2e  aced by a value.
25260 20 20 49 66 20 70 45 78 70 72 20 69 73 20 65 71    If pExpr is eq
25270 75 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20  uivalent to one 
25280 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
25290 73 20 6e 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b  s named in pWalk
252a0 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68  er->u.pConst, th
252b0 65 6e 20 6f 76 65 72 77 72 69 74 65 20 69 74 20  en overwrite it 
252c0 77 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72  with its.** corr
252d0 65 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e  esponding value.
252e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
252f0 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74  ropagateConstant
25300 45 78 70 72 52 65 77 72 69 74 65 28 57 61 6c 6b  ExprRewrite(Walk
25310 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
25320 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
25330 20 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74   i;.  WhereConst
25340 20 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20   *pConst;.  if( 
25350 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
25360 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 52  LUMN ) return WR
25370 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
25380 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
25390 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65  y(pExpr, EP_Fixe
253a0 64 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 57  dCol) ) return W
253b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70  RC_Continue;.  p
253c0 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d  Const = pWalker-
253d0 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72  >u.pConst;.  for
253e0 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e  (i=0; i<pConst->
253f0 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  nConst; i++){.  
25400 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20    Expr *pColumn 
25410 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  = pConst->apExpr
25420 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28 20 70  [i*2];.    if( p
25430 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20  Column==pExpr ) 
25440 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
25450 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c  ( pColumn->iTabl
25460 65 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e!=pExpr->iTable
25470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25480 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43   if( pColumn->iC
25490 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43  olumn!=pExpr->iC
254a0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
254b0 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74 63 68  ;.    /* A match
254c0 20 69 73 20 66 6f 75 6e 64 2e 20 20 41 64 64 20   is found.  Add 
254d0 74 68 65 20 45 50 5f 46 69 78 65 64 43 6f 6c 20  the EP_FixedCol 
254e0 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20 20 20  property */.    
254f0 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b  pConst->nChng++;
25500 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72  .    ExprClearPr
25510 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25520 5f 4c 65 61 66 29 3b 0a 20 20 20 20 45 78 70 72  _Leaf);.    Expr
25530 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
25540 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b  r, EP_FixedCol);
25550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
25560 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
25570 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
25580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
25590 70 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  p(pConst->pParse
255a0 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70  ->db, pConst->ap
255b0 45 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b  Expr[i*2+1], 0);
255c0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
255d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
255e0 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ne;.}../*.** The
255f0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f   WHERE-clause co
25600 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
25610 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
25620 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
25630 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
25640 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
25650 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e   form COLUMN=CON
25660 53 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53  STANT or.** CONS
25670 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74  TANT=COLUMN that
25680 20 6d 75 73 74 20 62 65 20 74 72 65 65 20 28 69   must be tree (i
25690 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
256a0 66 20 74 68 65 20 74 65 72 6d 73 20 74 6f 70 2d  f the terms top-
256b0 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e  level.** AND-con
256c0 6e 65 63 74 65 64 20 74 65 72 6d 73 20 74 68 61  nected terms tha
256d0 74 20 61 72 65 20 6e 6f 74 20 70 61 72 74 20 6f  t are not part o
256e0 66 20 61 20 4f 4e 20 63 6c 61 75 73 65 20 66 72  f a ON clause fr
256f0 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a  om a LEFT JOIN).
25700 2a 2a 20 74 68 65 6e 20 74 68 72 6f 75 67 68 6f  ** then througho
25710 75 74 20 74 68 65 20 71 75 65 72 79 20 72 65 70  ut the query rep
25720 6c 61 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f  lace all other o
25730 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 43 4f  ccurrences of CO
25740 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e  LUMN.** with CON
25750 53 54 41 4e 54 20 77 69 74 68 69 6e 20 74 68 65  STANT within the
25760 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
25770 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
25780 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
25790 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  **      SELECT *
257a0 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
257b0 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39 20 41   WHERE t1.a=39 A
257c0 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44  ND t2.b=t1.a AND
257d0 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a   t3.c=t2.b.**.**
257e0 20 49 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   Is transformed 
257f0 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  into.**.**      
25800 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25810 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 74  , t2, t3 WHERE t
25820 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d  1.a=39 AND t2.b=
25830 33 39 20 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a  39 AND t3.c=39.*
25840 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
25850 20 69 66 20 61 6e 79 20 74 72 61 6e 73 66 6f 72   if any transfor
25860 6d 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 61  mations where ma
25870 64 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  de and false if 
25880 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  not..**.** Imple
25890 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
258a0 20 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   Constant propag
258b0 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b 79 20  ation is tricky 
258c0 64 75 65 20 74 6f 20 61 66 66 69 6e 69 74 79 0a  due to affinity.
258d0 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  ** and collating
258e0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 65 72 61   sequence intera
258f0 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65  ctions.  Conside
25900 72 20 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a  r this example:.
25910 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  **.**    CREATE 
25920 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 2c 62  TABLE t1(a INT,b
25930 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e   TEXT);.**    IN
25940 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
25950 55 45 53 28 31 32 33 2c 27 30 31 32 33 27 29 3b  UES(123,'0123');
25960 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25970 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
25980 31 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20  123 AND b=a;.** 
25990 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
259a0 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20   t1 WHERE a=123 
259b0 41 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a  AND b=123;.**.**
259c0 20 54 68 65 20 74 77 6f 20 53 45 4c 45 43 54 20   The two SELECT 
259d0 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65  statements above
259e0 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 64   should return d
259f0 69 66 66 65 72 65 6e 74 20 61 6e 73 77 65 72 73  ifferent answers
25a00 2e 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77  .  b=a.** is alw
25a10 61 79 20 74 72 75 65 20 62 65 63 61 75 73 65 20  ay true because 
25a20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75  the comparison u
25a30 73 65 73 20 6e 75 6d 65 72 69 63 20 61 66 66 69  ses numeric affi
25a40 6e 69 74 79 2c 20 62 75 74 20 62 3d 31 32 33 0a  nity, but b=123.
25a50 2a 2a 20 69 73 20 66 61 6c 73 65 20 62 65 63 61  ** is false beca
25a60 75 73 65 20 69 74 20 75 73 65 73 20 74 65 78 74  use it uses text
25a70 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 27 30   affinity and '0
25a80 31 32 33 27 20 69 73 20 6e 6f 74 20 74 68 65 20  123' is not the 
25a90 73 61 6d 65 20 61 73 20 27 31 32 33 27 2e 0a 2a  same as '123'..*
25aa0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
25ab0 20 74 68 69 73 2c 20 74 68 65 20 65 78 70 72 65   this, the expre
25ac0 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f  ssion tree is no
25ad0 74 20 61 63 74 75 61 6c 6c 79 20 63 68 61 6e 67  t actually chang
25ae0 65 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22  ed from.** "b=a"
25af0 20 74 6f 20 22 62 3d 31 32 33 22 20 62 75 74 20   to "b=123" but 
25b00 72 61 74 68 65 72 20 74 68 65 20 22 61 22 20 69  rather the "a" i
25b10 6e 20 22 62 3d 61 22 20 69 73 20 74 61 67 67 65  n "b=a" is tagge
25b20 64 20 77 69 74 68 20 45 50 5f 46 69 78 65 64 43  d with EP_FixedC
25b30 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 22 31  ol.** and the "1
25b40 32 33 22 20 76 61 6c 75 65 20 69 73 20 68 75 6e  23" value is hun
25b50 67 20 6f 66 66 20 6f 66 20 74 68 65 20 70 4c 65  g off of the pLe
25b60 66 74 20 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64  ft pointer.  Cod
25b70 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72  e generator.** r
25b80 6f 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20  outines know to 
25b90 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 6e  generate the con
25ba0 73 74 61 6e 74 20 22 31 32 33 22 20 69 6e 73 74  stant "123" inst
25bb0 65 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75  ead of looking u
25bc0 70 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  p the.** column 
25bd0 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f  value.  Also, to
25be0 20 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e   avoid collation
25bf0 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20   problems, this 
25c00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
25c10 2a 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  ** only attempte
25c20 64 20 69 66 20 74 68 65 20 22 61 3d 31 32 33 22  d if the "a=123"
25c30 20 74 65 72 6d 20 75 73 65 73 20 74 68 65 20 64   term uses the d
25c40 65 66 61 75 6c 74 20 42 49 4e 41 52 59 20 63 6f  efault BINARY co
25c50 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
25c60 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65  ic int propagate
25c70 43 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50 61 72  Constants(.  Par
25c80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
25c90 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
25ca0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
25cb0 20 2a 70 20 20 20 20 20 20 20 20 2f 2a 20 54 68   *p        /* Th
25cc0 65 20 71 75 65 72 79 20 69 6e 20 77 68 69 63 68  e query in which
25cd0 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20 63 6f   to propagate co
25ce0 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
25cf0 57 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20  WhereConst x;.  
25d00 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20  Walker w;.  int 
25d10 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70  nChng = 0;.  x.p
25d20 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
25d30 20 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e    do{.    x.nCon
25d40 73 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43  st = 0;.    x.nC
25d50 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61  hng = 0;.    x.a
25d60 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 66  pExpr = 0;.    f
25d70 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
25d80 26 78 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  &x, p->pWhere);.
25d90 20 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74      if( x.nConst
25da0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
25db0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
25dc0 29 29 3b 0a 20 20 20 20 20 20 77 2e 70 50 61 72  ));.      w.pPar
25dd0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
25de0 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
25df0 63 6b 20 3d 20 70 72 6f 70 61 67 61 74 65 43 6f  ck = propagateCo
25e00 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74  nstantExprRewrit
25e10 65 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65  e;.      w.xSele
25e20 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
25e30 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
25e40 6f 70 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c  op;.      w.xSel
25e50 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
25e60 3b 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b 65 72  ;.      w.walker
25e70 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  Depth = 0;.     
25e80 20 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78   w.u.pConst = &x
25e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
25ea0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d 3e 70  alkExpr(&w, p->p
25eb0 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
25ec0 6c 69 74 65 33 44 62 46 72 65 65 28 78 2e 70 50  lite3DbFree(x.pP
25ed0 61 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78  arse->db, x.apEx
25ee0 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67  pr);.      nChng
25ef0 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20   += x.nChng;.   
25f00 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e   }.  }while( x.n
25f10 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65 74 75  Chng );  .  retu
25f20 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66  rn nChng;.}..#if
25f30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25f40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
25f50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
25f60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
25f70 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
25f80 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
25f90 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
25fa0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
25fb0 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
25fc0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
25fd0 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
25fe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
25ff0 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
26000 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
26010 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
26020 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
26030 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
26040 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
26050 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
26060 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
26070 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
26080 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
26090 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
260a0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
260b0 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
260c0 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
260d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
260e0 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
260f0 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
26100 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
26110 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
26120 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
26130 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
26140 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69   (** This restri
26150 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65  ction was remove
26160 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e  d on 2017-09-29.
26170 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20    We used to.** 
26180 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c            disall
26190 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ow this optimiza
261a0 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61  tion for aggrega
261b0 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 62  te subqueries, b
261c0 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ut now.**       
261d0 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65      it is allowe
261e0 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68 65  d by putting the
261f0 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
26200 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
26210 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
26220 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e 47  The added HAVING
26230 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74   clause is point
26240 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62 71  less if the subq
26250 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20  uery lacks.**   
26260 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50 20          a GROUP 
26270 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  BY clause.  But 
26280 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c  such a HAVING cl
26290 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72  ause is also har
262a0 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  mless.**        
262b0 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73     so there does
262c0 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62   not appear to b
262d0 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20  e any reason to 
262e0 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a  add extra logic.
262f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f 20  **           to 
26300 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29  suppress it. **)
26310 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
26320 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
26330 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
26340 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
26350 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
26360 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
26370 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
26380 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
26390 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
263a0 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
263b0 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73 65 20  **       clause 
263c0 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
263d0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
263e0 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
263f0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
26400 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
26410 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
26420 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a  FT JOIN and the.
26430 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73  **       express
26440 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64  ion to be pushed
26450 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63   down does not c
26460 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ome from the ON 
26470 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
26480 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49  on that LEFT JOI
26490 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  N..**.**   (5) T
264a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
264b0 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
264c0 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
264d0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
264e0 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
264f0 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43  FT JOIN where iC
26500 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65  ursor is not the
26510 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
26520 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20  e of that.**    
26530 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41     left join.  A
26540 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  n example:.**.**
26550 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
26560 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  T *.**          
26570 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20   FROM (SELECT 1 
26580 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS a1 UNION ALL 
26590 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a  SELECT 2) AS aa.
265a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49  **           JOI
265b0 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62  N (SELECT 1 AS b
265c0 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  2 UNION ALL SELE
265d0 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28  CT 2) AS bb ON (
265e0 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20  a1=b2).**       
265f0 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53      LEFT JOIN (S
26600 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e  ELECT 8 AS c3 UN
26610 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39  ION ALL SELECT 9
26620 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32  ) AS cc ON (b2=2
26630 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54  );.**.**       T
26640 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
26650 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a  r is three rows:
26660 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c    (1,1,NULL),(2,
26670 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a  2,8),(2,2,9)..**
26680 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68         But if th
26690 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65  e (b2=2) term we
266a0 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  re to be pushed 
266b0 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62  down into the bb
266c0 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20   subquery,.**   
266d0 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c      then the (1,
266e0 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c  1,NULL) row woul
266f0 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e  d be suppressed.
26700 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68 65  .**.**   (6) The
26710 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66 65 61   inner query fea
26720 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tures one or mor
26730 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  e window-functio
26740 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20  ns (since .**   
26750 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20 74      changes to t
26760 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26770 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  of the inner que
26780 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20  ry could change 
26790 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 77 69  the .**       wi
267a0 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63 68 20  ndow over which 
267b0 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
267c0 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 29   are calculated)
267d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
267e0 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
267f0 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
26800 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
26810 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
26820 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
26830 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
26840 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
26850 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
26860 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
26870 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
26880 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
26890 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
268a0 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
268b0 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
268c0 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
268d0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
268e0 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
268f0 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
26900 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
26910 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
26920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
26930 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
26940 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
26950 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20    int iCursor,  
26960 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
26970 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
26980 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
26990 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20  t isLeftJoin    
269a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
269b0 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68  Subq is the righ
269c0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
269d0 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78   JOIN */.){.  Ex
269e0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
269f0 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
26a00 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
26a10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
26a20 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
26a30 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
26a40 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
26a50 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
26a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26a70 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
26a80 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57 69 6e   if( pSubq->pWin
26a90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
26aa0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26ab0 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  6) */.#endif..#i
26ac0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26ad0 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  G.  /* Only the 
26ae0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20  first term of a 
26af0 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76  compound can hav
26b00 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e  e a WITH clause.
26b10 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20    But make.  ** 
26b20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65  sure no other te
26b30 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53  rms are marked S
26b40 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20 63  F_Recursive in c
26b50 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68  ase something ch
26b60 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68  anges.  ** in th
26b70 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  e future..  */. 
26b80 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70   {.    Select *p
26b90 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d  X;  .    for(pX=
26ba0 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
26bb0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
26bc0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65   assert( (pX->se
26bd0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
26be0 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20  ursive))==0 );. 
26bf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
26c00 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c  .  if( pSubq->pL
26c10 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72  imit!=0 ){.    r
26c20 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26c30 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
26c40 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65   }.  while( pWhe
26c50 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
26c60 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  {.    nChng += p
26c70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
26c80 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
26c90 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
26ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74   iCursor, isLeft
26cd0 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72  Join);.    pWher
26ce0 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66  e = pWhere->pLef
26cf0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c  t;.  }.  if( isL
26d00 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45  eftJoin.   && (E
26d10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26d20 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
26d30 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  n)==0.         |
26d40 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  | pWhere->iRight
26d50 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
26d60 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  or).  ){.    ret
26d70 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
26d80 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d  ction (4) */.  }
26d90 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
26da0 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
26db0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57  _FromJoin) && pW
26dc0 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
26dd0 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29  Table!=iCursor )
26de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
26df0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26e00 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
26e10 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
26e20 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
26e30 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
26e40 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
26e50 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
26e60 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
26e70 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77  xt x;.      pNew
26e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
26e90 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  p(pParse->db, pW
26ea0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
26eb0 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e  unsetJoinExpr(pN
26ec0 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78  ew, -1);.      x
26ed0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
26ee0 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
26ef0 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
26f00 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
26f10 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
26f20 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b  .isLeftJoin = 0;
26f30 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
26f40 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b  = pSubq->pEList;
26f50 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
26f60 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77  bstExpr(&x, pNew
26f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75  );.      if( pSu
26f80 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
26f90 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
26fa0 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48         pSubq->pH
26fb0 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
26fc0 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70  xprAnd(pParse, p
26fd0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
26fe0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
26ff0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
27000 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
27010 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
27020 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c  , pSubq->pWhere,
27030 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
27040 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
27050 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
27060 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
27070 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
27080 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
27090 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
270a0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
270b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
270c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46  */../*.** The pF
270d0 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  unc is the only 
270e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
270f0 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  on in the query.
27100 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a    Check to see.*
27110 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  * if the query i
27120 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
27130 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
27140 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  timization. .**.
27150 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
27160 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
27170 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
27180 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65  ptimization, the
27190 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d  n set.** *ppMinM
271a0 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45  ax to be an ORDE
271b0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  R BY clause to b
271c0 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f  e used for the o
271d0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  ptimization.** a
271e0 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72  nd return either
271f0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27200 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
27210 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e  RBY_MAX dependin
27220 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20  g on.** whether 
27230 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29  pFunc is a min()
27240 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
27250 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
27260 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
27270 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
27280 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
27290 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a  zation, return.*
272a0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
272b0 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75  NORMAL (which mu
272c0 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a  st be zero)..**.
272d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
272e0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61  must be called a
272f0 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66  fter aggregate f
27300 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65  unctions have be
27310 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75  en.** located bu
27320 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61  t before their a
27330 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65  rguments have be
27340 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20  en subjected to 
27350 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61  aggregate.** ana
27360 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lysis..*/.static
27370 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
27380 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
27390 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69  r *pFunc, ExprLi
273a0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
273b0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
273c0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
273d0 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  L;      /* Retur
273e0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70  n value */.  Exp
273f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
27400 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20  pFunc->x.pList; 
27410 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
27420 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
27430 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27440 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *zFunc;         
27450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
27460 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  me of aggregate 
27470 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a  function pFunc *
27480 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
27490 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72  rderBy;.  u8 sor
274a0 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  tOrder;..  asser
274b0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
274c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75  );.  assert( pFu
274d0 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  nc->op==TK_AGG_F
274e0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28  UNCTION );.  if(
274f0 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
27500 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
27510 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20   return eRet;.  
27520 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75  zFunc = pFunc->u
27530 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  .zToken;.  if( s
27540 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
27550 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
27560 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
27570 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
27580 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
27590 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20  SQLITE_SO_ASC;. 
275a0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
275b0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
275c0 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
275d0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
275e0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
275f0 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
27600 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65  TE_SO_DESC;.  }e
27610 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
27620 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d  eRet;.  }.  *ppM
27630 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79  inMax = pOrderBy
27640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
27650 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
27660 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
27670 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64  pOrderBy!=0 || d
27680 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27690 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
276a0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
276b0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
276c0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75  ortOrder;.  retu
276d0 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
276e0 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
276f0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
27700 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
27710 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
27720 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
27730 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
27740 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
27750 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
27760 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
27770 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
27780 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
27790 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
277a0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
277b0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
277c0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
277d0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
277e0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
277f0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
27800 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
27810 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
27820 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
27830 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
27840 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
27850 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
27860 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
27870 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
27880 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
27890 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
278a0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
278b0 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
278c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
278d0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
278e0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
278f0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
27900 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
27910 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
27920 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
27930 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
27940 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
27950 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
27960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
27970 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
27980 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
27990 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
279a0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
279b0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
279c0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
279d0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
279e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
279f0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
27a00 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
27a10 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
27a20 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
27a30 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
27a40 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
27a50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27a60 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
27a70 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
27a80 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
27a90 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
27aa0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
27ab0 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
27ac0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
27ad0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
27ae0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
27af0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
27b00 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
27b10 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
27b20 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
27b30 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
27b40 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
27b50 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
27b60 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
27b70 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
27b80 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
27b90 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
27ba0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
27bb0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
27bc0 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
27bd0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
27be0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
27bf0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
27c00 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
27c10 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27c20 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
27c30 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
27c40 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
27c50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27c60 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
27c70 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
27c80 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49  && pFrom->fg.isI
27c90 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
27ca0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
27cb0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
27cc0 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20  har *zIndexedBy 
27cd0 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64  = pFrom->u1.zInd
27ce0 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65  exedBy;.    Inde
27cf0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
27d00 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
27d10 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
27d20 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
27d30 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
27d40 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20   zIndexedBy); . 
27d50 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
27d60 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
27d70 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
27d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
27da0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
27db0 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30  ", zIndexedBy, 0
27dc0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
27dd0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
27de0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27df0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27e00 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
27e10 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  BIndex = pIdx;. 
27e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
27e30 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
27e40 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
27e50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
27e60 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
27e70 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
27e80 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
27e90 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
27ea0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
27eb0 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
27ec0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
27ed0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
27ee0 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
27ef0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
27f00 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
27f10 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
27f20 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
27f30 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
27f40 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
27f50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
27f60 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
27f70 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
27f80 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
27f90 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
27fa0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
27fb0 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
27fc0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
27fd0 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
27fe0 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
27ff0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
28000 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
28010 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
28020 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
28030 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
28040 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
28050 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
28060 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
28070 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
28080 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
28090 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
280a0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
280b0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
280c0 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
280d0 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
280e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
280f0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
28100 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
28110 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
28120 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
28130 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
28140 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
28150 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
28160 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
28170 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
28180 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
28190 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
281a0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
281b0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
281c0 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
281d0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
281e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
281f0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
28200 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
28210 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
28220 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
28230 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
28240 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
28250 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
28260 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
28270 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
28280 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28290 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
282a0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
282b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
282c0 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
282d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
282e0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
282f0 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
28300 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
28310 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
28320 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
28330 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
28340 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
28350 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
28360 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
28370 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
28380 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
28390 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
283a0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
283b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
283c0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
283d0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
283e0 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
283f0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
28400 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
28410 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
28420 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
28430 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
28440 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
28450 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
28460 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
28470 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
28480 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28490 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
284a0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
284b0 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
284c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
284d0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
284e0 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
284f0 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
28500 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
28510 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28520 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
28530 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
28540 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
28550 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28560 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
28570 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
28580 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30  , TK_ASTERISK, 0
28590 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
285a0 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
285b0 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
285c0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
285d0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
285e0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
285f0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
28600 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
28610 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
28620 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d  >pWith = 0;.  p-
28630 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
28640 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
28650 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
28660 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
28670 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
28680 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76  Flags |= SF_Conv
28690 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28  erted;.  assert(
286a0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30   pNew->pPrior!=0
286b0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69   );.  pNew->pPri
286c0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
286d0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
286e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
286f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28700 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
28710 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
28720 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
28730 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
28740 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
28750 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
28760 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
28770 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
28780 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
28790 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
287a0 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
287b0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
287c0 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
287d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
287e0 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
287f0 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
28800 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
28810 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
28820 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
28830 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
28840 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
28850 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
28860 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
28870 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
28880 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
28890 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
288a0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
288b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
288c0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
288d0 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
288e0 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
288f0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
28900 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
28910 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
28920 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
28930 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
28940 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
28950 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
28960 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
28970 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
28980 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
28990 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
289a0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
289b0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
289c0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
289d0 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
289e0 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
289f0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
28a00 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
28a10 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
28a20 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
28a30 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
28a40 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
28a50 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
28a60 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
28a70 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
28a80 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
28a90 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ab0 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
28ac0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
28ad0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
28ae0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
28af0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
28b00 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
28b10 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
28b20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
28b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28b40 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
28b50 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
28b60 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
28b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
28b80 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
28b90 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
28ba0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
28bb0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
28bc0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
28bd0 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
28be0 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
28bf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
28c00 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
28c10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28c20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
28c30 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
28c40 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
28c50 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
28c60 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
28c70 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
28c80 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
28c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28ca0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28cb0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
28cc0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
28cd0 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
28ce0 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
28cf0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
28d00 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
28d10 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
28d20 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
28d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
28d40 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
28d50 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
28d60 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
28d70 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
28d80 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
28d90 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
28da0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
28db0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
28dc0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
28dd0 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
28de0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
28df0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
28e00 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
28e10 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
28e20 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
28e30 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
28e40 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
28e50 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
28e60 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
28e70 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
28e80 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
28e90 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
28ea0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
28eb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
28ec0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
28ed0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
28ee0 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
28ef0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
28f00 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
28f10 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
28f20 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
28f30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
28f40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28f50 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
28f60 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
28f70 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
28f80 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
28f90 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
28fa0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
28fb0 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
28fc0 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
28fd0 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
28fe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
28ff0 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
29000 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
29010 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
29020 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
29030 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
29040 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
29050 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
29060 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
29070 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
29080 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
29090 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
290a0 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
290b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
290c0 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
290d0 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
290e0 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
290f0 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
29100 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
29110 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
29120 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
29130 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
29140 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
29150 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
29160 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
29170 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
29180 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
29190 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
291a0 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
291b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
291c0 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
291d0 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
291e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
291f0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
29200 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
29210 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
29220 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29230 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
29240 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
29250 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
29260 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29270 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29280 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
29290 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
292a0 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
292b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
292c0 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
292d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
292e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
292f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29300 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
29310 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
29320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
29330 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
29340 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
29350 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
29380 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
29390 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
293a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
293b0 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
293c0 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
293d0 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
293e0 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
293f0 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
29400 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
29410 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
29420 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
29430 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
29440 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
29450 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
29460 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
29470 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
29480 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
29490 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
294a0 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
294b0 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
294c0 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
294d0 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
294e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
294f0 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
29500 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
29510 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
29520 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
29530 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
29540 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
29550 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
29560 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
29570 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
29580 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
29590 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
295a0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
295b0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
295c0 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
295d0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
295e0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
295f0 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
29600 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
29610 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
29620 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
29630 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29640 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
29650 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
29660 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29680 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
29690 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
296a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
296b0 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
296c0 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
296d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
296e0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
296f0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
29700 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
29710 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
29720 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
29730 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
29740 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29750 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
29760 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
29770 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
29780 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
29790 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
297a0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
297b0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
297c0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
297d0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
297e0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
297f0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
29800 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
29810 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
29820 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
29830 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
29840 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
29850 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
29860 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
29870 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29880 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29890 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
298a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
298b0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
298c0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
298d0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
298e0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
298f0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
29900 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
29910 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
29920 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
29930 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
29940 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
29950 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
29960 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
29970 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
29980 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
29990 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
299a0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
299b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
299c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
299d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
299e0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
299f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
29a00 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
29a10 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
29a20 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
29a30 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
29a40 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
29a50 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
29a60 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29a70 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
29a80 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
29a90 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
29aa0 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
29ab0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
29ac0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
29ad0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
29ae0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
29af0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
29b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29b10 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
29b20 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
29b30 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
29b40 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
29b50 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20  ->nTabRef>2 ){. 
29b60 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29b70 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
29b80 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c  pParse, "multipl
29b90 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
29ba0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a  recursive table:
29bb0 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d   %s", pCte->zNam
29bc0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
29bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29be0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
29bf0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54  assert( pTab->nT
29c00 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20  abRef==1 || .   
29c10 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d           ((pSel-
29c20 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63  >selFlags&SF_Rec
29c30 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d  ursive) && pTab-
29c40 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a  >nTabRef==2 ));.
29c50 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
29c60 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
29c70 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
29c80 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20     pSavedWith = 
29c90 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
29ca0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
29cb0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
29cc0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
29cd0 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
29ce0 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e  *pPrior = pSel->
29cf0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73  pPrior;.      as
29d00 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57  sert( pPrior->pW
29d10 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ith==0 );.      
29d20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
29d30 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20  pSel->pWith;.   
29d40 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
29d50 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50  lect(pWalker, pP
29d60 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72  rior);.      pPr
29d70 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  ior->pWith = 0;.
29d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d90 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29da0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
29db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
29dc0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29dd0 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  th;..    for(pLe
29de0 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
29df0 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
29e00 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
29e10 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
29e20 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
29e30 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
29e40 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
29e50 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
29e60 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
29e70 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
29e80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29e90 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
29ea0 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
29eb0 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
29ec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
29ed0 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
29ee0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
29ef0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
29f00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29f10 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29f20 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
29f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29f40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
29f50 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
29f60 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
29f70 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
29f80 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
29f90 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
29fa0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
29fb0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
29fc0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29fd0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
29fe0 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
29ff0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
2a000 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
2a010 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74  >zCteErr = "mult
2a020 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
2a030 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
2a040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a050 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
2a060 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
2a070 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
2a080 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
2a090 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2a0a0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
2a0b0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
2a0c0 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43    }.    pCte->zC
2a0d0 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
2a0e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
2a0f0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
2a100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a110 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
2a120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a130 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
2a140 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
2a150 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a160 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
2a170 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
2a180 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
2a190 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
2a1a0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
2a1b0 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
2a1c0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
2a1d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2a1e0 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
2a1f0 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
2a200 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
2a210 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
2a220 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
2a230 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
2a240 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
2a250 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
2a260 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
2a270 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
2a280 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
2a290 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
2a2a0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2a2b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2a2c0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2a2d0 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  e;.  if( OK_IF_A
2a2e0 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73  LWAYS_TRUE(pPars
2a2f0 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e  e->pWith) && p->
2a300 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
2a310 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
2a320 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
2a330 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20  >pWith;.    if( 
2a340 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
2a350 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2a360 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
2a370 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2a380 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
2a390 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Outer;.    }.  }
2a3a0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
2a3b0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
2a3c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2a3d0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
2a3e0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2a3f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a400 72 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e  rgument represen
2a410 74 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72  ts a.** sub-quer
2a420 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
2a430 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2a440 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
2a450 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
2a460 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c  ocates and popul
2a470 61 74 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  ates the SrcList
2a480 5f 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63  _item.pTab objec
2a490 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
2a4a0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
2a4b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
2a4c0 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d  rwise, if an OOM
2a4d0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2a4e0 74 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  tered,.** SQLITE
2a4f0 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73  _NOMEM..*/.int s
2a500 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2a510 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
2a520 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
2a530 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
2a540 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20  .  Select *pSel 
2a550 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2a560 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
2a570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
2a580 20 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61   );.  pFrom->pTa
2a590 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
2a5a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
2a5b0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
2a5c0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
2a5d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
2a5e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a5f0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
2a600 3d 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  = 1;.  if( pFrom
2a610 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
2a620 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
2a630 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
2a640 61 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d  arse->db, pFrom-
2a650 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73  >zAlias);.  }els
2a660 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  e{.    pTab->zNa
2a670 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2a680 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2a690 22 73 75 62 71 75 65 72 79 5f 25 75 22 2c 20 70  "subquery_%u", p
2a6a0 53 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d  Sel->selId);.  }
2a6b0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e  .  while( pSel->
2a6c0 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
2a6d0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
2a6e0 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  .  sqlite3Column
2a6f0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
2a700 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
2a710 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
2a720 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  pTab->aCol);.  p
2a730 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
2a740 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
2a750 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
2a760 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
2a770 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
2a780 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  ;.  pTab->tabFla
2a790 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
2a7a0 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  al;..  return SQ
2a7b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a7c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a7d0 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
2a7e0 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
2a7f0 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
2a800 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
2a810 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
2a820 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
2a830 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
2a840 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
2a850 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
2a860 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
2a870 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
2a880 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
2a890 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2a8a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
2a8b0 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
2a8c0 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
2a8d0 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
2a8e0 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
2a8f0 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
2a900 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
2a910 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
2a920 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
2a930 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
2a940 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
2a950 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
2a960 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
2a970 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
2a980 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
2a990 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
2a9a0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
2a9b0 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
2a9c0 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
2a9d0 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
2a9e0 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
2a9f0 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
2aa00 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
2aa10 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
2aa20 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
2aa30 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
2aa40 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
2aa50 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
2aa60 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
2aa70 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
2aa80 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
2aa90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2aaa0 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
2aab0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2aac0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
2aad0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
2aae0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2aaf0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
2ab00 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
2ab10 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
2ab20 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
2ab30 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
2ab40 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
2ab50 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
2ab60 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
2ab70 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
2ab80 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
2ab90 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
2aba0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
2abb0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
2abc0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
2abd0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
2abe0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
2abf0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
2ac00 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
2ac10 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
2ac20 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
2ac30 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2ac40 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2ac50 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
2ac60 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
2ac70 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
2ac80 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
2ac90 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
2aca0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2acb0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
2acc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2acd0 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2ace0 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
2acf0 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
2ad00 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
2ad10 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46  gs;.  u32 elistF
2ad20 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e  lags = 0;..  p->
2ad30 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
2ad40 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
2ad50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ad60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2ad70 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2ad80 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
2ad90 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c  =0 );.  if( (sel
2ada0 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
2adb0 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
2adc0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2add0 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
2ade0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
2adf0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2ae00 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
2ae10 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  sh(pParse, p->pW
2ae20 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
2ae30 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
2ae40 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
2ae50 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
2ae60 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
2ae70 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
2ae80 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
2ae90 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
2aea0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2aeb0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
2aec0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
2aed0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
2aee0 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
2aef0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2af00 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
2af10 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
2af20 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
2af30 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
2af40 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
2af50 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
2af60 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
2af70 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
2af80 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
2af90 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
2afa0 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
2afb0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2afc0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2afd0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2afe0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2aff0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2b000 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b010 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
2b020 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
2b030 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
2b040 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
2b050 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
2b060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
2b070 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
2b080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b090 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
2b0a0 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
2b0b0 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
2b0c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b0d0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
2b0e0 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
2b0f0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
2b100 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
2b110 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b120 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
2b130 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
2b140 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
2b150 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
2b160 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2b170 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2b180 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
2b190 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
2b1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b1b0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
2b1c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2b1d0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
2b1e0 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
2b1f0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b200 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b210 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
2b220 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
2b230 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b240 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  t;.#endif.    }e
2b250 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
2b260 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
2b270 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
2b280 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b290 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2b2a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
2b2b0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
2b2c0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
2b2d0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2b2e0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
2b2f0 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
2b300 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
2b310 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b320 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
2b330 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29 7b  abRef>=0xffff ){
2b340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b350 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2b360 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
2b370 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
2b380 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
2b390 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
2b3a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
2b3b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
2b3c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2b3d0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2b3e0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  .      pTab->nTa
2b3f0 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  bRef++;.      if
2b400 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
2b410 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75  b) && cannotBeFu
2b420 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
2b430 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  From) ){.       
2b440 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b450 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  t;.      }.#if !
2b460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b470 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
2b480 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
2b490 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2b4a0 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
2b4b0 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54  tual(pTab) || pT
2b4c0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
2b4d0 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b         i16 nCol;
2b4e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2b4f0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
2b500 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2b510 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
2b520 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
2b530 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b540 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
2b550 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
2b560 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
2b570 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
2b580 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
2b590 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54         nCol = pT
2b5a0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
2b5b0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d    pTab->nCol = -
2b5c0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2b5d0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
2b5e0 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
2b5f0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
2b600 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Tab->nCol = nCol
2b610 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2b620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
2b630 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
2b640 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
2b650 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
2b660 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
2b670 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
2b680 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
2b690 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
2b6a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2b6b0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
2b6c0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
2b6d0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
2b6e0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
2b6f0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
2b700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
2b710 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2b720 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2b730 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
2b740 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2b750 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
2b760 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
2b770 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
2b780 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
2b790 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
2b7a0 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
2b7b0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
2b7c0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
2b7d0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
2b7e0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
2b7f0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
2b800 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
2b810 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
2b820 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
2b830 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
2b840 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72  TK_ASTERISK oper
2b850 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
2b860 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
2b870 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  in the column.  
2b880 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f  ** list.  The fo
2b890 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
2b8a0 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
2b8b0 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a  the TK_ASTERISK.
2b8c0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
2b8d0 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68   and expand each
2b8e0 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
2b8f0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
2b900 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c  in.  ** all tabl
2b910 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
2b920 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
2b930 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
2b940 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2b950 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
2b960 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
2b970 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
2b980 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
2b990 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
2b9a0 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
2b9b0 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
2b9c0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2b9d0 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
2b9e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
2b9f0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2ba00 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
2ba10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
2ba20 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
2ba30 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
2ba40 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
2ba50 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
2ba60 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
2ba70 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
2ba80 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
2ba90 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73   break;.    elis
2baa0 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c  tFlags |= pE->fl
2bab0 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  ags;.  }.  if( k
2bac0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
2bad0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2bae0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
2baf0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
2bb00 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
2bb10 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
2bb20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
2bb30 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
2bb40 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
2bb50 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
2bb60 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
2bb70 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
2bb80 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
2bb90 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
2bba0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
2bbb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
2bbc0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
2bbd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
2bbe0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
2bbf0 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
2bc00 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
2bc10 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
2bc20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
2bc30 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc50 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
2bc60 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
2bc70 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
2bc80 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
2bc90 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
2bca0 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
2bcb0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73  Expr;.      elis
2bcc0 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c  tFlags |= pE->fl
2bcd0 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68  ags;.      pRigh
2bce0 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
2bcf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2bd00 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2bd10 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
2bd20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
2bd30 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20  K_ASTERISK.     
2bd40 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b    && (pE->op!=TK
2bd50 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
2bd60 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29  op!=TK_ASTERISK)
2bd70 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2bd80 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
2bd90 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
2bda0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2bdb0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
2bdc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2bdd0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
2bde0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
2bdf0 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
2be00 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2be10 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2be20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
2be30 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
2be40 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
2be50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
2be60 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2be70 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
2be80 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
2be90 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
2bea0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
2beb0 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
2bec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
2bed0 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
2bee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bef0 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
2bf00 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
2bf10 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
2bf20 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
2bf30 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
2bf40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
2bf50 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
2bf60 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
2bf70 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
2bf80 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
2bf90 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
2bfa0 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
2bfb0 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
2bfc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
2bfd0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2bff0 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
2c000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2c010 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c020 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
2c030 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
2c040 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
2c050 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
2c060 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
2c070 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
2c080 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
2c090 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
2c0a0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
2c0b0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
2c0c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2c0d0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
2c0e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
2c0f0 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
2c100 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
2c110 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
2c120 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
2c130 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2c140 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
2c150 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c160 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
2c170 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
2c180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c190 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
2c1a0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
2c1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c1c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c1d0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
2c1e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2c1f0 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
2c200 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
2c210 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
2c220 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
2c230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2c240 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
2c250 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
2c260 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
2c270 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c280 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c2a0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
2c2b0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2c2c0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
2c2d0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
2c2e0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
2c2f0 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
2c300 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
2c310 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
2c320 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
2c330 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
2c340 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
2c350 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
2c360 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
2c370 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2c380 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
2c390 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
2c3a0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
2c3b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2c3c0 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
2c3d0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
2c3e0 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
2c3f0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
2c400 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
2c410 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
2c420 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
2c430 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
2c440 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
2c450 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c470 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
2c480 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
2c490 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
2c4a0 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
2c4b0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
2c4c0 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
2c4d0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c4f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c500 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2c510 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
2c520 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
2c530 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66  dden', omit it f
2c540 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64  rom the expanded
2c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2c560 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20  result-set list 
2c570 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43  unless the SELEC
2c580 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63  T has the SF_Inc
2c590 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20  ludeHidden.     
2c5a0 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65         ** bit se
2c5b0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2c5c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2c5d0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2c5e0 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
2c5f0 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
2c600 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f     && IsHiddenCo
2c610 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
2c620 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20  [j]) .          
2c630 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2c640 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c660 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
2c670 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
2c680 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
2c690 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
2c6b0 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom->fg.jointype
2c6c0 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
2c6d0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2c6e0 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
2c6f0 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
2c700 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
2c710 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
2c720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c730 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
2c740 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
2c750 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
2c760 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
2c770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
2c780 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
2c790 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c7b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c7d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2c7e0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
2c7f0 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
2c800 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
2c810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
2c820 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
2c830 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
2c840 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c860 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
2c870 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
2c880 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c8d0 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
2c8e0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2c8f0 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
2c900 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
2c910 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
2c920 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
2c930 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
2c940 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
2c950 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
2c960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c970 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
2c990 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
2c9a0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
2c9b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2c9c0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2c9d0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2c9e0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
2c9f0 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
2ca00 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
2ca10 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
2ca20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
2ca30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
2ca40 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
2ca50 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
2ca60 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2ca70 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2ca80 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
2ca90 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ft, pExpr);.    
2caa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
2cac0 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
2cad0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
2cae0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
2caf0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
2cb00 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
2cb10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2cb20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
2cb30 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
2cb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cb50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cb60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2cb70 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
2cb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cb90 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
2cba0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
2cbb0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
2cbc0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2cbd0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
2cbe0 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43  it(&sColname, zC
2cbf0 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
2cc00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2cc10 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
2cc20 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
2cc30 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
2cc40 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
2cc50 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2cc60 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
2cc70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2cc80 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2cc90 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
2cca0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
2ccb0 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
2ccc0 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cce0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
2ccf0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
2cd00 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
2cd10 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2cd30 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
2cd40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2cd50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cd60 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
2cd70 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
2cd80 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2cd90 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdc0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
2cdd0 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
2cde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cdf0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
2ce00 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
2ce10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ce20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
2ce30 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
2ce40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ce50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ce60 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
2ce70 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
2ce80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ce90 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
2cea0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
2ceb0 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
2cec0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ced0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2cee0 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
2cef0 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
2cf00 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cf20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2cf30 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
2cf40 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
2cf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2cf70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2cf80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
2cf90 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
2cfa0 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
2cfb0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
2cfc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
2cfd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
2cfe0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2cff0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
2d000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d010 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
2d020 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
2d030 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
2d040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2d050 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
2d060 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61     if( (elistFla
2d070 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63  gs & (EP_HasFunc
2d080 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d  |EP_Subquery))!=
2d090 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65  0 ){.      p->se
2d0a0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d  lFlags |= SF_Com
2d0b0 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20  plexResult;.    
2d0c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2d0d0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d0e0 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
2d0f0 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
2d100 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
2d110 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
2d120 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
2d130 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2d140 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
2d150 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
2d160 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
2d170 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
2d180 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
2d190 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
2d1a0 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
2d1b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2d1c0 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
2d1d0 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
2d1e0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
2d1f0 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
2d200 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
2d210 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
2d220 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
2d230 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
2d240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2d250 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
2d260 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
2d270 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
2d280 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d290 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2d2a0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
2d2b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d2c0 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
2d2d0 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
2d2e0 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f  e-tree walker fo
2d2f0 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
2d300 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79  nts..** subquery
2d310 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d320 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d330 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
2d340 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
2d350 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  d, Select *NotUs
2d360 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
2d370 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2d380 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2d390 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d3a0 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  nue;.}..#if SQLI
2d3b0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
2d3c0 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54  lways assert.  T
2d3d0 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  his xSelectCallb
2d3e0 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ack2 implementat
2d3f0 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20  ion proves that 
2d400 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61  the.** xSelectCa
2d410 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72  llback2 is never
2d420 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69   invoked..*/.voi
2d430 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
2d440 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65  alkAssert2(Walke
2d450 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65  r *NotUsed, Sele
2d460 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  ct *NotUsed2){. 
2d470 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d480 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2d490 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28  sed2);.  assert(
2d4a0 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f   0 );.}.#endif./
2d4b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d4c0 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
2d4d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
2d4e0 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
2d4f0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
2d500 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2d510 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
2d520 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
2d530 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
2d540 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
2d550 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
2d560 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
2d570 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
2d580 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
2d590 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
2d5a0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
2d5b0 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
2d5c0 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
2d5d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2d5e0 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
2d5f0 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
2d600 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
2d610 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
2d620 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
2d630 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
2d640 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
2d650 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2d660 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
2d670 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
2d680 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
2d690 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
2d6a0 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
2d6b0 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
2d6c0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
2d6d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2d6e0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
2d6f0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2d700 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
2d710 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2d720 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
2d730 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2d740 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2d750 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
2d760 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
2d770 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  e;.  if( OK_IF_A
2d780 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73  LWAYS_TRUE(pPars
2d790 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20  e->hasCompound) 
2d7a0 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
2d7b0 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
2d7c0 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
2d7d0 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
2d7e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d7f0 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  k2 = 0;.    sqli
2d800 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2d810 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
2d820 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d830 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
2d840 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  nder;.  w.xSelec
2d850 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
2d860 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71  ectPopWith;.  sq
2d870 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2d880 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
2d890 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2d8a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
2d8b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
2d8c0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
2d8d0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
2d8e0 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
2d8f0 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
2d900 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
2d910 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
2d920 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
2d930 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
2d940 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
2d950 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
2d960 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
2d970 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
2d980 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
2d990 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
2d9a0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
2d9b0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
2d9c0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
2d9d0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
2d9e0 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
2d9f0 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
2da00 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
2da10 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
2da20 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
2da30 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
2da40 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
2da50 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
2da60 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
2da70 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
2da80 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2da90 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
2daa0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
2dab0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
2dac0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
2dad0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2dae0 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
2daf0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
2db00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
2db10 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
2db20 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
2db30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2db40 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
2db50 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
2db60 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
2db70 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   );.  if( p->sel
2db80 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
2db90 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
2dba0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
2dbb0 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
2dbc0 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
2dbd0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
2dbe0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2dbf0 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
2dc00 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
2dc10 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2dc20 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
2dc30 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2dc40 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
2dc50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2dc60 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2dc70 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2dc80 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2dc90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
2dca0 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
2dcb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2dcc0 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
2dcd0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
2dce0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2dcf0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  t;.      if( pSe
2dd00 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  l ){.        whi
2dd10 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2dd20 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
2dd30 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
2dd40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2dd50 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
2dd60 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
2dd70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
2dd80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2dd90 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
2dda0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
2ddb0 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
2ddc0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2ddd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
2dde0 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
2ddf0 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
2de00 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2de10 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
2de20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2de30 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
2de40 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
2de50 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
2de60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2de70 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2de80 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
2de90 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2dea0 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
2deb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2dec0 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
2ded0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2dee0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
2def0 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  ectWalkNoop;.  w
2df00 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2df10 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
2df20 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
2df30 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2df40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2df50 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2df60 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2df70 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2df80 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
2df90 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2dfa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2dfb0 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
2dfc0 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
2dfd0 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
2dfe0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
2dff0 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
2e000 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
2e010 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
2e020 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
2e030 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
2e040 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
2e050 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
2e060 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
2e070 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
2e080 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
2e090 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
2e0a0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2e0b0 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
2e0c0 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
2e0d0 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
2e0e0 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
2e0f0 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
2e100 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
2e110 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
2e120 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
2e130 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
2e140 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
2e150 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e160 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
2e170 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
2e180 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
2e190 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
2e1a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2e1b0 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
2e1c0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2e1d0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2e1e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2e1f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2e200 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2e210 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2e220 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
2e230 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
2e240 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
2e250 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
2e260 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  .){.  assert( p!
2e270 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
2e280 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e290 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2e2a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e2b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2e2c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2e2d0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
2e2e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e2f0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
2e300 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
2e310 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2e320 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e330 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e340 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
2e350 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
2e360 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
2e370 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
2e380 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
2e390 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e3a0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2e3b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2e3c0 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
2e3d0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
2e3e0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
2e3f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2e400 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
2e410 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
2e420 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
2e430 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
2e440 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
2e450 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
2e460 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
2e470 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
2e480 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
2e490 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
2e4a0 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
2e4b0 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
2e4c0 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
2e4d0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
2e4e0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
2e4f0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2e500 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2e510 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2e520 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2e530 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2e540 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
2e550 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
2e560 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
2e570 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
2e580 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
2e590 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
2e5a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2e5b0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2e5c0 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
2e5d0 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
2e5e0 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
2e5f0 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
2e600 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
2e610 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
2e620 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
2e630 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
2e640 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
2e650 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2e660 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2e670 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
2e680 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2e690 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
2e6a0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2e6b0 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2e6c0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
2e6d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2e6e0 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
2e6f0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2e700 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2e710 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2e720 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
2e730 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2e740 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2e750 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2e760 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2e770 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
2e780 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
2e790 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2e7a0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
2e7b0 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
2e7c0 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
2e7d0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
2e7e0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
2e7f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2e800 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
2e810 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
2e820 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
2e830 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
2e840 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
2e850 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2e860 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2e870 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2e880 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
2e890 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
2e8a0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
2e8b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
2e8c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2e8d0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
2e8e0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
2e8f0 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
2e900 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
2e910 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
2e920 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
2e930 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
2e940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
2e950 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2e960 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
2e970 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2e980 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
2e990 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 73  ,0,0);.        s
2e9a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2e9b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2e9c0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
2e9d0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
2e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9f0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2ea00 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2ea10 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
2ea20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2ea30 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
2ea40 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
2ea50 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
2ea60 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
2ea70 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
2ea80 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2ea90 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
2eaa0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2eab0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2eac0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2ead0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2eae0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2eaf0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2eb00 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2eb10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
2eb20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2eb30 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2eb40 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
2eb50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2eb60 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2eb70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2eb80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2eb90 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2eba0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2ebb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ebc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
2ebd0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
2ebe0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
2ebf0 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
2ec00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2ec10 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2ec20 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2ec30 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  .  }.}.../*.** U
2ec40 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
2ec50 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
2ec60 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
2ec70 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
2ec80 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2ec90 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  or position..**.
2eca0 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69 73 20  ** If regAcc is 
2ecb0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
2ecc0 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28 29 20  re are no min() 
2ecd0 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  or max() aggrega
2ece0 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67 49 6e  tes.** in pAggIn
2ecf0 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70 6f  fo, then only po
2ed00 70 75 6c 61 74 65 20 74 68 65 20 70 41 67 67 49  pulate the pAggI
2ed10 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2ed20 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 2a 2a  r accumulator.**
2ed30 20 72 65 67 69 73 74 65 72 73 20 69 66 20 72 65   registers if re
2ed40 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63 6f  gister regAcc co
2ed50 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63 61  ntains 0. The ca
2ed60 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20 63  ller will take c
2ed70 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e  are.** of settin
2ed80 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 72  g and clearing r
2ed90 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  egAcc..*/.static
2eda0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2edb0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2edc0 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41 63  Parse, int regAc
2edd0 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  c, AggInfo *pAgg
2ede0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2edf0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2ee00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2ee10 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2ee20 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2ee30 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2ee40 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2ee50 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2ee60 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2ee70 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2ee80 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2ee90 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2eea0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2eeb0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2eec0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2eed0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2eee0 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2eef0 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2ef00 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2ef10 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2ef20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2ef30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ef40 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2ef50 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
2ef60 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2ef70 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
2ef80 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
2ef90 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
2efa0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2efb0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
2efc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2efd0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2efe0 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c  List, regAgg, 0,
2eff0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
2f000 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f010 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
2f020 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
2f030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2f040 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2f050 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
2f060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2f070 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
2f080 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2f090 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2f0a0 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2f0b0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2f0c0 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2f0d0 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2f0e0 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2f0f0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2f100 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2f110 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2f120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f130 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2f140 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2f150 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2f160 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2f170 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2f180 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f190 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2f1a0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2f1b0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2f1c0 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2f1d0 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2f1e0 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2f1f0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2f200 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2f210 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2f220 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2f230 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2f240 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2f250 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2f260 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2f270 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2f280 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2f290 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2f2a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2f2b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2f2c0 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f2d0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f2e0 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2f2f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f310 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2f320 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2f330 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2f340 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2f350 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2f360 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2f370 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
2f380 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2f390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2f3a0 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2f3b0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2f3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f3d0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2f3e0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2f3f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2f400 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2f410 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
2f420 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
2f430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f440 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2f450 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
2f460 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74    }.  if( regHit
2f470 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2f480 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b  >nAccumulator ){
2f490 0a 20 20 20 20 72 65 67 48 69 74 20 3d 20 72 65  .    regHit = re
2f4a0 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gAcc;.  }.  if( 
2f4b0 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
2f4c0 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
2f4d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f4e0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
2f4f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f500 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  ;.  }.  for(i=0,
2f510 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2f520 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2f530 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2f540 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2f550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2f560 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2f570 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2f580 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2f590 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66  ctMode = 0;.  if
2f5a0 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2f5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f5c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f5d0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2f5e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2f5f0 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2f600 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2f610 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2f620 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2f630 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2f640 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2f650 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2f660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f670 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2f680 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2f690 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2f6a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f6c0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2f6d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2f700 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2f710 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f730 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2f740 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2f750 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2f760 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2f770 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2f780 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2f790 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2f7a0 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2f7b0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2f7c0 29 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )));.    sqlite3
2f7d0 56 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72  VdbeExplain(pPar
2f7e0 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42  se, 0, "SCAN TAB
2f7f0 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2f800 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2f810 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2f820 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2f830 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2f840 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2f850 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2f860 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  "".    );.  }.}.
2f870 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2f880 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2f890 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2f8a0 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
2f8b0 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
2f8c0 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67  k used by having
2f8d0 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a  ToWhere()..**.**
2f8e0 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73   If the node pas
2f8f0 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  sed to the callb
2f900 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20  ack is a TK_AND 
2f910 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  node, return .**
2f920 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f   WRC_Continue to
2f930 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c   tell sqlite3Wal
2f940 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61  kExpr() to itera
2f950 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64  te through child
2f960 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   nodes..**.** Ot
2f970 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2f980 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68  WRC_Prune. In th
2f990 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68  is case, also ch
2f9a0 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  eck if the .** s
2f9b0 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  ub-expression ma
2f9c0 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72  tches the criter
2f9d0 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76  ia for being mov
2f9e0 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  ed to the WHERE.
2f9f0 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f  ** clause. If so
2fa00 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
2fa10 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
2fa20 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62   replace the sub
2fa30 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77  -expression.** w
2fa40 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47  ithin the HAVING
2fa50 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2fa60 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e   a constant "1".
2fa70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2fa80 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2fa90 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2faa0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2fab0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2fac0 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p!=TK_AND ){.   
2fad0 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57   Select *pS = pW
2fae0 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
2faf0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2fb00 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
2fb10 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72  rGroupBy(pWalker
2fb20 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  ->pParse, pExpr,
2fb30 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29   pS->pGroupBy) )
2fb40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2fb50 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  *db = pWalker->p
2fb60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
2fb70 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
2fb80 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
2fb90 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
2fba0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
2fbb0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
2fbc0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
2fbd0 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20     Expr *pWhere 
2fbe0 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20  = pS->pWhere;.  
2fbf0 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c        SWAP(Expr,
2fc00 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b   *pNew, *pExpr);
2fc10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
2fc20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2fc30 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
2fc40 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2fc50 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
2fc60 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
2fc70 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2fc80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2fc90 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
2fca0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2fcb0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2fcc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
2fcd0 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
2fce0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
2fcf0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
2fd00 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
2fd10 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
2fd20 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
2fd30 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2fd40 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
2fd50 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
2fd60 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
2fd70 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
2fd80 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
2fd90 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2fda0 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
2fdb0 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
2fdc0 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
2fdd0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
2fde0 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
2fdf0 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2fe00 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
2fe10 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
2fe20 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
2fe30 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
2fe40 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2fe50 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
2fe60 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
2fe70 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
2fe80 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
2fe90 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
2fea0 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
2feb0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2fec0 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
2fed0 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
2fee0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
2fef0 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
2ff00 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
2ff10 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2ff20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
2ff30 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
2ff40 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2ff50 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2ff60 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2ff70 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2ff80 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2ff90 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2ffa0 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2ffb0 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
2ffc0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2ffd0 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
2ffe0 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
2fff0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30000 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
30010 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
30020 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30030 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
30040 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
30050 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
30060 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
30070 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
30080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
30090 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
300a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
300b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
300c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
300d0 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
300e0 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
300f0 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
30100 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
30110 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
30120 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
30130 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
30140 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
30150 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
30160 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
30170 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30180 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
30190 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
301a0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
301b0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
301c0 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
301d0 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
301e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
301f0 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
30200 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30210 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
30220 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
30230 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
30240 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
30250 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
30260 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
30270 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
30280 65 6d 2b 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63  em++){.    Selec
30290 74 20 2a 70 53 31 3b 0a 20 20 20 20 69 66 28 20  t *pS1;.    if( 
302a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
302b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
302c0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
302d0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
302e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
302f0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
30300 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30310 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
30320 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
30330 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
30340 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
30350 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30360 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30370 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
30380 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
30390 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
303a0 53 31 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  S1 = pItem->pSel
303b0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 54 68  ect;.    if( pTh
303c0 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c  is->pSelect->sel
303d0 49 64 21 3d 70 53 31 2d 3e 73 65 6c 49 64 20 29  Id!=pS1->selId )
303e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71  {.      /* The q
303f0 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 6c  uery flattener l
30400 65 66 74 20 74 77 6f 20 64 69 66 66 65 72 65 6e  eft two differen
30410 74 20 43 54 45 20 74 61 62 6c 65 73 20 77 69 74  t CTE tables wit
30420 68 20 69 64 65 6e 74 69 63 61 6c 0a 20 20 20 20  h identical.    
30430 20 20 2a 2a 20 6e 61 6d 65 73 20 69 6e 20 74 68    ** names in th
30440 65 20 73 61 6d 65 20 46 52 4f 4d 20 63 6c 61 75  e same FROM clau
30450 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  se. */.      con
30460 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
30470 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
30480 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68 69 73  Compare(0, pThis
30490 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
304a0 65 2c 20 70 53 31 2d 3e 70 57 68 65 72 65 2c 20  e, pS1->pWhere, 
304b0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  -1) ){.      /* 
304c0 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
304d0 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
304e0 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
304f0 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
30500 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
30510 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
30520 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
30530 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
30540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
30550 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
30560 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
30570 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
30580 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
30590 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
305a0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
305b0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
305c0 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
305d0 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
305e0 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
305f0 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
30600 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
30610 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
30620 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
30630 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
30640 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
30650 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
30660 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
30670 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
30680 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
30690 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
306a0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
306b0 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
306c0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
306d0 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
306e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
306f0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a   a LIMIT clause.
30700 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69 73  **   *  There is
30710 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f   no WHERE or GRO
30720 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
30730 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73  clauses on the s
30740 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a  ubqueries.**   *
30750 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
30760 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f  y is a simple co
30770 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74  unt(*).**.** Ret
30780 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
30790 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
307a0 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73  undertaken..*/.s
307b0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f  tatic int countO
307c0 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f  fViewOptimizatio
307d0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
307e0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
307f0 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50  elect *pSub, *pP
30800 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45  rior;.  Expr *pE
30810 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  xpr;.  Expr *pCo
30820 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  unt;.  sqlite3 *
30830 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65  db;.  if( (p->se
30840 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
30850 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75  egate)==0 ) retu
30860 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20  rn 0;   /* This 
30870 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
30880 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  */.  if( p->pELi
30890 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
308a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
308b0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
308c0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
308d0 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  /.  pExpr = p->p
308e0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
308f0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
30900 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
30910 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ION ) return 0; 
30920 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
30930 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
30940 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
30950 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d  3_stricmp(pExpr-
30960 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74  >u.zToken,"count
30970 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ") ) return 0;  
30980 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f  /* Is count() */
30990 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  .  if( pExpr->x.
309a0 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72  pList!=0 ) retur
309b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
309c0 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
309d0 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66  count(*) */.  if
309e0 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  ( p->pSrc->nSrc!
309f0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
30a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a10 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20  /* One table in 
30a20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20  FROM  */.  pSub 
30a30 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
30a40 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70  pSelect;.  if( p
30a50 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sub==0 ) return 
30a60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30a80 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75  The FROM is a su
30a90 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
30aa0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
30ab0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30ad0 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f   Must be a compo
30ae0 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a  und ry */.  do{.
30af0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70      if( pSub->op
30b00 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62  !=TK_ALL && pSub
30b10 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
30b20 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  n 0;  /* Must be
30b30 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20   UNION ALL */.  
30b40 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
30b50 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b70 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20      /* No WHERE 
30b80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66  clause */.    if
30b90 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
30ba0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  /* No LIMIT clau
30bd0 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
30be0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
30bf0 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65  F_Aggregate ) re
30c00 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e  turn 0;     /* N
30c10 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
30c20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53  */.    pSub = pS
30c30 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20  ub->pPrior;     
30c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65           /* Repe
30c60 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  at over compound
30c70 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53   */.  }while( pS
30c80 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ub );..  /* If w
30c90 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
30ca0 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b  nt then it is OK
30cb0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
30cc0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a  transformation *
30cd0 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
30ce0 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d  ->db;.  pCount =
30cf0 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20   pExpr;.  pExpr 
30d00 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d  = 0;.  pSub = p-
30d10 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30d20 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e  ect;.  p->pSrc->
30d30 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  a[0].pSelect = 0
30d40 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
30d50 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
30d60 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63  pSrc);.  p->pSrc
30d70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
30d80 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
30d90 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53  b, sizeof(*p->pS
30da0 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  rc));.  while( p
30db0 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20  Sub ){.    Expr 
30dc0 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69  *pTerm;.    pPri
30dd0 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  or = pSub->pPrio
30de0 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72  r;.    pSub->pPr
30df0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ior = 0;.    pSu
30e00 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  b->pNext = 0;.  
30e10 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
30e20 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
30e30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46  ;.    pSub->selF
30e40 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
30e50 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ound;.    pSub->
30e60 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
30e70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
30e80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
30e90 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
30ea0 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20   pTerm = pPrior 
30eb0 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  ? sqlite3ExprDup
30ec0 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20  (db, pCount, 0) 
30ed0 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53  : pCount;.    pS
30ee0 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ub->pEList = sql
30ef0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
30f00 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  nd(pParse, 0, pT
30f10 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
30f20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
30f30 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
30f40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
30f50 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65  ite3PExprAddSele
30f60 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ct(pParse, pTerm
30f70 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28  , pSub);.    if(
30f80 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
30f90 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
30fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30fb0 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
30fc0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
30fd0 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20  TK_PLUS, pTerm, 
30fe0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
30ff0 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b    pSub = pPrior;
31000 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74  .  }.  p->pEList
31010 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[0].pExpr = p
31020 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  Expr;.  p->selFl
31030 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
31040 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43  gate;..#if SELEC
31050 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
31060 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
31070 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
31080 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
31090 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
310a0 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d  p,("After count-
310b0 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61  of-view optimiza
310c0 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
310d0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
310e0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
310f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
31100 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
31110 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  /* SQLITE_COUNTO
31120 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
31130 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ON */../*.** Gen
31140 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
31150 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
31160 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
31170 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
31180 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
31190 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
311a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
311b0 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
311c0 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
311d0 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
311e0 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
311f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
31200 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31210 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
31220 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
31230 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
31240 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
31250 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
31260 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
31270 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
31280 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
31290 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
312a0 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
312b0 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
312c0 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
312d0 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
312e0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
312f0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
31300 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
31310 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
31320 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
31330 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
31340 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
31350 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
31360 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
31370 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
31380 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
31390 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
313a0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
313b0 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
313c0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
313d0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
313e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
313f0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
31400 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
31410 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
31420 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
31430 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
31440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31450 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
31460 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
31470 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
31480 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
31490 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
314a0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
314b0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
314c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
314d0 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69  List = 0;  /* Li
314e0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
314f0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
31500 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
31510 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
31520 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
31530 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
31540 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
31550 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
31560 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
31570 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
31580 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
31590 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
315a0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
315b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
315c0 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
315d0 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
315e0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
315f0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
31600 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
31610 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
31620 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
31630 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
31640 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
31650 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
31660 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
31670 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
31680 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
31690 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
316a0 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
316b0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
316c0 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
316d0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
316e0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
316f0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
31700 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
31710 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
31720 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
31730 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
31740 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
31750 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
31760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
31770 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
31780 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
31790 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d  pMinMaxOrderBy =
317a0 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52   0;  /* Added OR
317b0 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d  DER BY for min/m
317c0 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  ax queries */.  
317d0 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20  u8 minMaxFlag;  
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
317f0 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d  * Flag for min/m
31800 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20  ax queries */.. 
31810 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
31820 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
31830 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
31840 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
31850 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
31860 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
31870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
31880 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
31890 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
318a0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
318b0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
318c0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
318d0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
318e0 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
318f0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
31900 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
31910 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
31920 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
31930 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73  ssing:\n", pPars
31940 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29  e->addrExplain))
31950 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
31960 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
31970 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
31980 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31990 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
319a0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
319b0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
319c0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
319d0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
319e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
319f0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
31a00 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69  t->eDest!=SRT_Fi
31a10 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
31a20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
31a30 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
31a40 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
31a50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
31a60 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
31a70 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51  st->eDest!=SRT_Q
31a80 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67  ueue );.  if( Ig
31a90 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
31aa0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
31ab0 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
31ac0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
31ad0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31ae0 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
31af0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
31b00 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
31b10 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
31b20 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a  =SRT_Discard ||.
31b30 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
31b40 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65  ->eDest==SRT_Que
31b50 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ue  || pDest->eD
31b60 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
31b70 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  o ||.           
31b80 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31b90 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70  T_DistQueue || p
31ba0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31bb0 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49  _Fifo);.    /* I
31bc0 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
31bd0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
31be0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
31bf0 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
31c00 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
31c10 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
31c20 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
31c30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31c40 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
31c50 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
31c60 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
31c70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
31c80 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
31c90 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
31ca0 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
31cb0 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
31cc0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
31cd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
31ce0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
31cf0 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  nd;.  }.  assert
31d00 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
31d10 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
31d20 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
31d30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
31d40 63 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20  ce & 0x104 ){.  
31d50 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31d60 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  104,pParse,p, ("
31d70 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
31d80 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
31d90 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31da0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
31db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
31dc0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
31dd0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
31de0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
31df0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
31e00 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
31e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
31e20 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 73 71 6c  OWFUNC.  if( sql
31e30 69 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74  ite3WindowRewrit
31e40 65 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  e(pParse, p) ){.
31e50 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
31e60 65 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53 45 4c  end;.  }.#if SEL
31e70 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
31e80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
31e90 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
31ea0 38 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  8 ){.    SELECTT
31eb0 52 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73  RACE(0x104,pPars
31ec0 65 2c 70 2c 20 28 22 61 66 74 65 72 20 77 69 6e  e,p, ("after win
31ed0 64 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e 22 29  dow rewrite:\n")
31ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31ef0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31f00 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
31f10 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
31f20 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
31f30 4e 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  NC */.  pTabList
31f40 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73   = p->pSrc;.  is
31f50 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
31f60 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
31f70 65 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65 74 28  e)!=0;.  memset(
31f80 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
31f90 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
31fa0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
31fb0 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
31fc0 20 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20   Try to various 
31fd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66  optimizations (f
31fe0 6c 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65  lattening subque
31ff0 72 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67  ries, and streng
32000 74 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f  th.  ** reductio
32010 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74  n of join operat
32020 6f 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d  ors) in the FROM
32030 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20   clause up into 
32040 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20  the main query. 
32050 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
32060 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
32070 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
32080 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
32090 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
320a0 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
320b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
320c0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
320d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
320e0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
320f0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
32100 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
32110 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54  ->pSelect;.    T
32120 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
32130 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  em->pTab;..    /
32140 2a 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a  * Convert LEFT J
32150 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66  OIN into JOIN if
32160 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
32170 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
32180 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ble.    ** of th
32190 65 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64  e LEFT JOIN used
321a0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
321b0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
321c0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
321d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
321e0 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73  FT)!=0.     && s
321f0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
32200 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70  sNonNullRow(p->p
32210 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
32220 75 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f  ursor).     && O
32230 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
32240 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69  ed(db, SQLITE_Si
32250 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20  mplifyJoin).    
32260 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
32270 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
32280 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e,p,.           
32290 20 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e       ("LEFT-JOIN
322a0 20 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a   simplifies to J
322b0 4f 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e  OIN on term %d\n
322c0 22 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ",i));.      pIt
322d0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
322e0 26 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  &= ~(JT_LEFT|JT_
322f0 4f 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e  OUTER);.      un
32300 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
32310 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
32320 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  ursor);.    }.. 
32330 20 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20     /* No futher 
32340 61 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74  action if this t
32350 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
32360 63 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73  clause is no a s
32370 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69  ubquery */.    i
32380 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
32390 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
323a0 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
323b0 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
323c0 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
323d0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
323e0 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
323f0 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
32400 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
32410 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
32420 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
32430 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
32440 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
32450 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
32460 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
32470 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
32480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32490 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
324a0 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
324b0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
324c0 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
324d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
324e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   }..    /* Do no
324f0 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  t try to flatten
32500 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
32510 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
32520 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67     ** Flattening
32530 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
32540 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70  bquery is only p
32550 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f  ossible if the o
32560 75 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a  uter query.    *
32570 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  * is not a join.
32580 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74    But if the out
32590 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
325a0 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
325b0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
325c0 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
325d0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
325e0 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69  tine and there i
325f0 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74  s no advantage t
32600 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e  o.    ** flatten
32610 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
32620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32630 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
32640 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
32650 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
32660 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
32670 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
32680 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
32690 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74  outer query cont
326a0 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22  ains a "complex"
326b0 20 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61   result set (tha
326c0 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20  t is,.    ** if 
326d0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
326e0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
326f0 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73  y uses functions
32700 20 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a   or subqueries).
32710 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
32720 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61  e subquery conta
32730 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ins an ORDER BY 
32740 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20  clause and if.  
32750 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20    ** it will be 
32760 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
32770 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65   co-routine, the
32780 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
32790 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72  .  This.    ** r
327a0 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77  estriction allow
327b0 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73  s SQL constructs
327c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
327d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
327e0 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  T expensive_func
327f0 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20  tion(x).    **  
32800 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78    FROM (SELECT x
32810 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
32820 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
32830 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
32840 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
32850 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63  tion() is only c
32860 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31  omputed on the 1
32870 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20  0 rows that.    
32880 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72  ** are output, r
32890 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79  ather than every
328a0 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
328b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
328c0 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
328d0 20 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20   that the outer 
328e0 71 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d  query have a com
328f0 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a  plex result set.
32900 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61      ** means tha
32910 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65  t flattening doe
32920 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c  s occur on simpl
32930 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e  er SQL constrain
32940 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ts without.    *
32950 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f  * the expensive_
32960 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a  function() like:
32970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32980 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
32990 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
329a0 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
329b0 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20  T 10);.    */.  
329c0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
329d0 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20  erBy!=0.     && 
329e0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  i==0.     && (p-
329f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
32a00 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30  omplexResult)!=0
32a10 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
32a20 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
32a30 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
32a40 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
32a50 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
32a60 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20  CROSS))!=0).    
32a70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
32a80 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
32a90 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
32aa0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
32ab0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
32ac0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
32ad0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
32ae0 6e 64 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  nd;.      /* Thi
32af0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
32b00 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
32b10 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
32b20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
32b30 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
32b40 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
32b50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
32b60 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
32b70 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21  t_end;.    if( !
32b80 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
32b90 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
32ba0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32bb0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
32bc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32be0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
32bf0 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
32c00 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
32c10 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
32c20 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
32c30 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
32c40 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
32c50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
32c60 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
32c70 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
32c80 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66  , p, pDest);.#if
32c90 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32ca0 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
32cb0 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c  RACE(0x1,pParse,
32cc0 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
32cd0 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
32ce0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28  ng\n"));.    if(
32cf0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
32d00 72 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d  race & 0x2000)!=
32d10 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72  0 && ExplainQuer
32d20 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72  yPlanParent(pPar
32d30 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  se)==0 ){.      
32d40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32d50 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32d60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32d70 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
32d80 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50   ) ExplainQueryP
32d90 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
32da0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32db0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32dc0 44 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61  Do the WHERE-cla
32dd0 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  use constant pro
32de0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
32df0 61 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73  ation if this is
32e00 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e  .  ** a join.  N
32e10 6f 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20  o need to speed 
32e20 74 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65  time on this ope
32e30 72 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a  ration for non-j
32e40 6f 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  oin queries.  **
32e50 20 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   as the equivale
32e60 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  nt optimization 
32e70 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20  will be handled 
32e80 62 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  by query planner
32e90 20 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   in.  ** sqlite3
32ea0 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
32eb0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
32ec0 74 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20  t->nSrc>1.   && 
32ed0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32ee0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50  led(db, SQLITE_P
32ef0 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20  ropagateConst). 
32f00 20 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f    && propagateCo
32f10 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
32f20 70 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  p).  ){.#if SELE
32f30 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32f40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
32f50 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
32f60 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
32f70 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
32f80 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63  arse,p,("After c
32f90 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
32fa0 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  ion:\n"));.     
32fb0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32fc0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
32fd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43  }else{.    SELEC
32ff0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
33000 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74  rse,p,("Constant
33010 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74   propagation not
33020 20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20   helpful\n"));. 
33030 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
33040 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
33050 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
33060 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
33070 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
33080 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
33090 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
330a0 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
330b0 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
330c0 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
330d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
330e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
330f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
33100 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
33110 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
33120 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
33130 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
33140 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
33150 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
33160 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
33170 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
33180 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
33190 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
331a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
331b0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
331c0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
331d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
331e0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
331f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
33200 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
33210 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
33220 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
33230 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
33240 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
33250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
33260 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
33270 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
33280 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
33290 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
332a0 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
332b0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
332c0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
332d0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
332e0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
332f0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
33300 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
33310 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
33320 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
33330 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
33340 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
33350 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
33360 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
33370 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
33380 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
33390 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
333a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
333b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
333c0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
333d0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
333e0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
333f0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
33400 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
33410 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
33420 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
33430 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
33440 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
33450 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
33460 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
33470 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
33480 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
33490 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
334a0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
334b0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
334c0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
334d0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
334e0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
334f0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
33500 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
33510 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
33520 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
33530 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
33540 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33550 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
33560 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
33570 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
33580 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
33590 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
335a0 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
335b0 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
335c0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
335d0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
335e0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
335f0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
33600 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
33610 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33620 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
33630 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
33640 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
33650 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33660 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
33670 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
33680 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
33690 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
336a0 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
336b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
336c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
336d0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
336e0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
336f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
33700 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
33710 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
33720 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
33730 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
33740 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
33750 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
33760 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54  tinue;..    /* T
33770 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
33780 62 71 75 65 72 79 20 73 68 6f 75 6c 64 20 6f 6e  bquery should on
33790 6c 79 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ly be generated 
337a0 6f 6e 63 65 2c 20 74 68 6f 75 67 68 20 69 74 20  once, though it 
337b0 69 73 0a 20 20 20 20 2a 2a 20 74 65 63 68 6e 69  is.    ** techni
337c0 63 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73 20 66  cally harmless f
337d0 6f 72 20 69 74 20 74 6f 20 62 65 20 67 65 6e 65  or it to be gene
337e0 72 61 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  rated multiple t
337f0 69 6d 65 73 2e 20 54 68 65 0a 20 20 20 20 2a 2a  imes. The.    **
33800 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
33810 74 28 29 20 77 69 6c 6c 20 64 65 74 65 63 74 20  t() will detect 
33820 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61  if something cha
33830 6e 67 65 73 20 74 6f 20 63 61 75 73 65 0a 20 20  nges to cause.  
33840 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 75    ** the same su
33850 62 71 75 65 72 79 20 74 6f 20 62 65 20 63 6f 64  bquery to be cod
33860 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
33870 73 2c 20 61 73 20 61 20 73 69 67 6e 61 6c 20 74  s, as a signal t
33880 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 76  o the.    ** dev
33890 65 6c 6f 70 65 72 73 20 74 6f 20 74 72 79 20 74  elopers to try t
338a0 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 73  o optimize the s
338b0 69 74 75 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ituation. */.   
338c0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
338d0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
338e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  ;..    /* Increm
338f0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
33900 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
33910 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
33920 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
33930 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
33940 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
33950 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
33960 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
33970 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
33980 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
33990 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
339a0 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
339b0 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
339c0 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
339d0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
339e0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
339f0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
33a00 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
33a10 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
33a20 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
33a30 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
33a40 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
33a50 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
33a60 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
33a70 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
33a80 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
33a90 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
33aa0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
33ab0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
33ac0 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
33ad0 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
33ae0 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
33af0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
33b00 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
33b10 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
33b20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
33b30 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
33b40 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20  ITE_PushDown).  
33b50 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
33b60 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
33b70 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
33b80 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
33b90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49               (pI
33bb0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
33bc0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29   & JT_OUTER)!=0)
33bd0 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  .    ){.#if SELE
33be0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
33bf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
33c00 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
33c10 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x100 ){.        
33c20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
33c30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
33c40 20 20 20 20 20 20 20 20 28 22 41 66 74 65 72 20          ("After 
33c50 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
33c60 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71  h-down into subq
33c70 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75  uery %d:\n", pSu
33c80 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
33c90 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33ca0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
33cb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
33cc0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
33cd0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
33ce0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
33cf0 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70  "Push-down not p
33d00 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20  ossible\n"));.  
33d10 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41    }..    zSavedA
33d20 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
33d30 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33d40 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  t;.    pParse->z
33d50 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
33d60 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  tem->zName;..   
33d70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
33d80 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
33d90 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
33da0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
33db0 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
33dc0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
33dd0 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62  utine if the sub
33de0 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20  query is.    ** 
33df0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
33e00 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
33e10 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  (so that it does
33e20 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
33e30 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
33e40 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
33e50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f      **.    ** TO
33e60 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74  DO: Are there ot
33e70 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69  her reasons besi
33e80 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20  de (1) to use a 
33e90 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  co-routine.    *
33ea0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
33eb0 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ?.    */.    if(
33ec0 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70   i==0.     && (p
33ed0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
33ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33ef0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
33f00 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
33f10 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
33f20 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20  =0)  /* (1) */. 
33f30 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
33f40 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
33f50 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
33f60 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
33f70 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
33f80 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
33f90 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
33fa0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
33fb0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
33fc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33fd0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
33fe0 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e    .      pItem->
33ff0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
34000 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
34010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34020 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
34030 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
34040 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
34050 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
34060 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
34070 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
34080 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34090 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
340a0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
340b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
340c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
340d0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
340e0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
340f0 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  );.      Explain
34100 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
34110 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e  e, 1, "CO-ROUTIN
34120 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
34130 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
34140 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
34150 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
34160 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
34170 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
34180 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
34190 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
341a0 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
341b0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
341c0 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
341d0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
341e0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
341f0 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
34200 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
34210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
34220 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
34230 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
34240 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
34250 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
34260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
34270 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
34280 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
34290 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
342a0 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
342b0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
342c0 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
342d0 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
342e0 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
342f0 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
34300 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
34310 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
34320 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
34330 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
34340 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
34350 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
34360 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
34370 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
34380 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
34390 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
343a0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
343b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
343c0 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
343d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
343e0 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
343f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
34400 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
34410 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
34420 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34430 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34440 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
34450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34460 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
34470 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34480 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
34490 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
344a0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
344b0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
344c0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
344d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
344e0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
344f0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
34500 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
34510 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
34520 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
34530 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
34540 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
34550 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
34560 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
34570 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
34580 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
34590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
345a0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
345b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
345c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
345d0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
345e0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
345f0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
34600 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34610 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
34620 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
34630 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
34640 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34650 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
34660 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
34670 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
34680 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
34690 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
346a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
346b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
346c0 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
346d0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
346e0 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
346f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
34700 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
34710 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
34720 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
34730 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
34740 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
34750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34760 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
34770 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
34780 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
34790 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
347a0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
347b0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
347c0 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20  1, "MATERIALIZE 
347d0 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64  %u", pSub->selId
347e0 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
347f0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
34800 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
34810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
34820 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
34830 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
34840 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
34850 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
34860 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34870 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
34880 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
34890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
348a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
348b0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
348c0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
348d0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
348e0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
348f0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34900 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
34910 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
34920 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
34930 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
34940 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
34950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34960 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34970 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
34980 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
34990 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
349a0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
349b0 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73  ht(p);.    pPars
349c0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
349d0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
349e0 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ext;.#endif.  }.
349f0 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c  .  /* Various el
34a00 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45  ements of the SE
34a10 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f  LECT copied into
34a20 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
34a30 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e   for.  ** conven
34a40 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73  ience */.  pELis
34a50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
34a60 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
34a70 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
34a80 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
34a90 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
34aa0 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
34ab0 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
34ac0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
34ad0 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
34ae0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
34af0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
34b00 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
34b10 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
34b20 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
34b30 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
34b40 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
34b50 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
34b60 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
34b70 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
34b80 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
34b90 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
34ba0 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
34bb0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
34bc0 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
34bd0 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
34be0 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
34bf0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
34c00 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
34c10 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
34c20 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
34c30 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
34c40 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
34c50 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
34c60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34c70 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
34c80 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
34c90 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
34ca0 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
34cb0 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
34cc0 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
34cd0 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
34ce0 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
34cf0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
34d00 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
34d10 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
34d20 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
34d30 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
34d40 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
34d50 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
34d60 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
34d70 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
34d80 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
34d90 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
34da0 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
34db0 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
34dc0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
34dd0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
34de0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
34df0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
34e00 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
34e10 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
34e20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
34e30 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
34e40 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
34e50 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
34e60 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
34e70 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
34e80 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
34e90 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
34ea0 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
34eb0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
34ec0 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
34ed0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
34ee0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
34ef0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
34f00 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
34f10 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
34f20 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
34f30 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
34f40 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
34f50 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
34f60 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
34f70 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
34f80 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
34f90 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
34fa0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
34fb0 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
34fc0 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
34fd0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
34fe0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
34ff0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
35000 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
35010 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
35020 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
35030 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
35040 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
35050 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
35060 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
35070 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
35080 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
35090 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
350a0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
350b0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
350c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
350d0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
350e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
350f0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
35100 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
35110 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
35120 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
35130 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
35140 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
35150 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
35160 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
35170 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
35180 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
35190 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
351a0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
351b0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
351c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
351d0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
351e0 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
351f0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
35200 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
35210 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
35220 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
35230 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
35240 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35250 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
35260 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
35270 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
35280 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
35290 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
352a0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
352b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
352c0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
352d0 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
352e0 69 73 74 28 0a 20 20 20 20 20 20 20 20 70 50 61  ist(.        pPa
352f0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
35300 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
35310 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
35320 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
35330 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
35340 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35350 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
35360 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35370 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35380 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
35390 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
353a0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
353b0 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
353c0 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
353d0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
353e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
353f0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
35400 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
35410 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
35420 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
35430 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
35440 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
35450 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
35460 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
35470 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
35480 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
35490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
354a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
354b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
354c0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
354d0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
354e0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
354f0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
35500 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
35510 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
35520 73 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  se);.  if( (p->s
35530 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
35540 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20  edLimit)==0 ){. 
35550 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
35560 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
35570 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
35580 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  }.  computeLimit
35590 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
355a0 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
355b0 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
355c0 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
355d0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
355e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
355f0 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74  eOpcode(v, sSort
35600 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20  .addrSortIndex, 
35610 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a  OP_SorterOpen);.
35620 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c      sSort.sortFl
35630 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f  ags |= SORTFLAG_
35640 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a  UseSorter;.  }..
35650 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68    /* Open an eph
35660 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20  emeral index to 
35670 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
35680 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
35690 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
356a0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
356b0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
356c0 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
356d0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
356e0 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
356f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
35700 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
35710 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35730 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
35740 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35760 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
35770 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
35780 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
35790 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357b0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
357c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
357d0 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
357e0 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
357f0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35800 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
35810 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
35820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
35830 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
35840 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35850 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
35860 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
35870 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
35880 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
35890 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
358a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
358b0 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
358c0 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
358d0 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
358e0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
358f0 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
35900 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d 3e 73           | (p->s
35910 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
35920 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e 64 65  edLimit);.#ifnde
35930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
35940 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57 69 6e  NDOWFUNC.    Win
35950 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e 70  dow *pWin = p->p
35960 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73  Win;      /* Mas
35970 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ter window objec
35980 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  t (or NULL) */. 
35990 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
359a0 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
359b0 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61 72 73  owCodeInit(pPars
359c0 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  e, pWin);.    }.
359d0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
359e0 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
359f0 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
35a00 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20 42 65  t );...    /* Be
35a10 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
35a20 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45   scan. */.    SE
35a30 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
35a40 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
35a50 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e  n\n"));.    pWIn
35a60 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
35a70 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
35a80 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
35a90 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
35aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ac0 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
35ad0 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
35ae0 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
35af0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
35b00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
35b10 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
35b20 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
35b30 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
35b40 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
35b50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
35b60 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
35b70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
35b80 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
35b90 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
35ba0 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
35bb0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
35bc0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
35bd0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
35be0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
35bf0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
35c00 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
35c10 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35c20 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
35c30 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
35c40 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
35c50 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
35c60 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20  ort.labelOBLopt 
35c70 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
35c80 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62  derByLimitOptLab
35c90 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  el(pWInfo);.    
35ca0 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53    if( sSort.nOBS
35cb0 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72  at==sSort.pOrder
35cc0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
35cd0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
35ce0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rBy = 0;.      }
35cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
35d00 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
35d10 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
35d20 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
35d30 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
35d40 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
35d50 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
35d60 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
35d70 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
35d80 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
35d90 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
35da0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
35db0 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  if( sSort.addrSo
35dc0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53  rtIndex>=0 && sS
35dd0 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20  ort.pOrderBy==0 
35de0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35df0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
35e00 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
35e10 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a  rtIndex);.    }.
35e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
35e30 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29  pEList==pEList )
35e40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35e50 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
35e60 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
35e70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 47  .      int addrG
35e80 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33 56 64  osub = sqlite3Vd
35e90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
35ea0 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  se);.      int i
35eb0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
35ec0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
35ed0 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  se);.      int i
35ee0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
35ef0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
35f00 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
35f10 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61  regGosub = ++pPa
35f20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
35f30 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43    sqlite3WindowC
35f40 6f 64 65 53 74 65 70 28 70 50 61 72 73 65 2c 20  odeStep(pParse, 
35f50 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
35f60 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
35f70 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
35f80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35f90 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
35fa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35fb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35fc0 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  v, addrGosub);. 
35fd0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
35fe0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65 72 2d  ment((v, "inner-
35ff0 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65 22  loop subroutine"
36000 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  ));.      sSort.
36010 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b  labelOBLopt = 0;
36020 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
36030 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
36040 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
36050 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
36060 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
36070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36080 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36090 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
360a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
360b0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
360c0 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  regGosub);.     
360d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
360e0 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70   "end inner-loop
360f0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
36100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36110 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
36120 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 65   iBreak);.    }e
36130 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
36140 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
36150 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  FUNC */.    {.  
36160 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
36170 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
36180 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 65 6c  op. */.      sel
36190 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
361a0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
361b0 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
361c0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
361d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
361e0 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
361f0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  o),.          sq
36200 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
36210 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
36220 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65        /* End the
36230 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
36240 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
36250 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
36260 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
36270 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
36280 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
36290 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
362a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
362b0 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
362c0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
362d0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
362e0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
362f0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
36300 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
36310 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
36320 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
36330 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
36340 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
36350 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
36360 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
36370 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
36380 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
36390 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
363a0 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
363b0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
363c0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
363d0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
363e0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
363f0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
36400 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36420 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
36430 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
36440 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
36450 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
36460 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
36470 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
36480 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
36490 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
364a0 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
364b0 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
364c0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
364d0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
364e0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
364f0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
36500 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
36510 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
36520 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
36530 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
36540 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
36550 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
36560 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
36570 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
36580 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
36590 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
365a0 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
365b0 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
365c0 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
365d0 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
365e0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
365f0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
36600 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
36610 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
36620 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
36630 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
36640 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
36650 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
36660 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
36670 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
36680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
36690 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
366a0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
366b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
366c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
366d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
366e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
366f0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
36700 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
36710 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
36720 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
36730 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
36740 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
36750 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
36760 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
36770 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
36780 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
36790 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
367a0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
367b0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
367c0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
367d0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
367e0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
367f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36800 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
36810 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
36820 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
36830 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
36840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
36850 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
36860 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
36870 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
36880 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
36890 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
368a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
368b0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
368c0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
368d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
368e0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
368f0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
36900 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
36910 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
36920 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
36930 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
36940 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
36950 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
36960 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
36970 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
36980 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
36990 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
369a0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
369b0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
369c0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
369d0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
369e0 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
369f0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
36a00 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
36a10 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
36a20 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
36a30 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
36a40 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
36a50 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
36a60 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
36a70 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
36a80 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
36a90 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
36aa0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
36ab0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
36ac0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
36ad0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
36ae0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
36af0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
36b00 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
36b10 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
36b20 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
36b30 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
36b40 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
36b50 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
36b60 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
36b70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
36b80 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  rse);..    /* Co
36b90 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
36ba0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
36bb0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
36bc0 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
36bd0 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
36be0 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
36bf0 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
36c00 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
36c10 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
36c20 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
36c30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
36c40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
36c50 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
36c60 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
36c70 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
36c80 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
36c90 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20  .uNC.pAggInfo = 
36ca0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56  &sAggInfo;.    V
36cb0 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46  VA_ONLY( sNC.ncF
36cc0 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e  lags = NC_UAggIn
36cd0 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67 49 6e  fo; ).    sAggIn
36ce0 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
36cf0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
36d00 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
36d10 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
36d20 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
36d30 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
36d40 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
36d50 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
36d60 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
36d70 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
36d80 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
36d90 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
36da0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
36db0 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
36dc0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
36dd0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
36de0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  By ){.        as
36df0 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d  sert( pWhere==p-
36e00 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20  >pWhere );.     
36e10 20 20 20 61 73 73 65 72 74 28 20 70 48 61 76 69     assert( pHavi
36e20 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29  ng==p->pHaving )
36e30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36e40 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70  ( pGroupBy==p->p
36e50 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 20  GroupBy );.     
36e60 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65     havingToWhere
36e70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
36e80 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d       pWhere = p-
36e90 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d  >pWhere;.      }
36ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
36eb0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
36ec0 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
36ed0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
36ee0 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
36ef0 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
36f00 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
36f10 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 26  p->pGroupBy==0 &
36f20 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  & p->pHaving==0 
36f30 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e  && sAggInfo.nFun
36f40 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 69  c==1 ){.      mi
36f50 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61  nMaxFlag = minMa
36f60 78 51 75 65 72 79 28 64 62 2c 20 73 41 67 67 49  xQuery(db, sAggI
36f70 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  nfo.aFunc[0].pEx
36f80 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65  pr, &pMinMaxOrde
36f90 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rBy);.    }else{
36fa0 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61  .      minMaxFla
36fb0 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
36fc0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  Y_NORMAL;.    }.
36fd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
36fe0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
36ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
37000 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
37010 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
37020 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
37030 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
37040 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
37050 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
37060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
37070 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
37080 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
37090 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
370a0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
370b0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
370c0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
370d0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
370e0 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
370f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
37100 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
37110 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
37120 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  d;.#if SELECTTRA
37130 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
37140 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
37150 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
37160 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
37170 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
37180 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
37190 28 22 41 66 74 65 72 20 61 67 67 72 65 67 61 74  ("After aggregat
371a0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
371b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
371c0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
371d0 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   p, 0);.      fo
371e0 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
371f0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  nfo.nColumn; ii+
37200 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
37210 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37220 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69  agg-column[%d] i
37230 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
37240 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
37250 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65  nfo.aCol[ii].iMe
37260 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
37270 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
37280 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  0, sAggInfo.aCol
37290 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  [ii].pExpr, 0);.
372a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
372b0 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
372c0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29  nfo.nFunc; ii++)
372d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
372e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67  3DebugPrintf("ag
372f0 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d  g-func[%d]: iMem
37300 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
37310 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
37320 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29  .aFunc[ii].iMem)
37330 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37340 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
37350 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
37360 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  ii].pExpr, 0);. 
37370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
37380 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  dif...    /* Pro
37390 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
373a0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
373b0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
373c0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
373d0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
373e0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
373f0 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
37400 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
37410 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
37420 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
37430 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
37440 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
37450 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
37460 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
37470 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
37480 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
37490 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
374a0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
374b0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
374c0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
374d0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
374e0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
374f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
37500 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
37510 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
37520 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
37530 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
37540 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
37550 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
37560 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
37570 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
37580 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
37590 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
375a0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
375b0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
375c0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
375d0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
375e0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
375f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
37600 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
37610 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
37620 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
37630 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
37640 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
37650 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
37660 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
37670 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
37680 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
37690 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
376a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
376b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
376c0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
376d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
376e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
376f0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
37700 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
37710 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
37720 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
37730 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
37740 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
37750 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
37760 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
37770 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
37780 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
37790 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
377a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
377b0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
377c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
377d0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
377e0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
377f0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
37800 61 72 73 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c  arse,pGroupBy,0,
37810 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
37820 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
37830 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
37840 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
37850 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
37860 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
37870 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
37880 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
37890 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
378a0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
378b0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
378c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
378d0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
378e0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
378f0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
37900 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
37910 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
37920 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
37930 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
37940 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
37950 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37960 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
37970 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37980 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
37990 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
379a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
379b0 73 65 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  se);.      regRe
379c0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
379d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
379e0 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
379f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
37a00 72 73 65 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  rse);.      iAMe
37a10 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
37a20 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
37a30 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
37a40 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
37a50 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
37a60 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
37a70 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
37a80 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
37a90 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
37aa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37ab0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
37ac0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
37ad0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
37ae0 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
37af0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
37b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
37b10 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
37b20 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
37b30 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
37b40 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
37b50 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
37b60 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
37b70 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
37b80 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
37b90 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
37ba0 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
37bb0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
37bc0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
37bd0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
37be0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
37bf0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
37c00 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
37c10 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
37c20 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
37c30 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
37c40 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
37c50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37c70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
37c80 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
37c90 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  et);.      SELEC
37ca0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
37cb0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
37cc0 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  "));.      pWInf
37cd0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
37ce0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
37cf0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
37d00 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
37d10 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
37d20 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
37d30 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
37d40 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
37d50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
37d60 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
37d70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
37d80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
37d90 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
37da0 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
37db0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
37dc0 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
37dd0 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
37de0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
37df0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
37e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
37e10 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
37e20 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
37e30 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
37e40 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
37e50 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
37e60 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
37e70 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
37e80 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
37e90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37ea0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
37eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37ec0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
37ed0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
37ee0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
37ef0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
37f00 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
37f10 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
37f20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
37f30 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
37f40 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
37f50 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
37f60 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
37f70 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
37f80 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
37f90 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
37fa0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
37fb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
37fc0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
37fd0 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
37fe0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
37ff0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
38000 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
38010 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
38020 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
38030 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
38040 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
38050 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
38060 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
38070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38080 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
38090 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
380a0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
380b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
380c0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
380d0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
380e0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
380f0 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
38100 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
38110 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
38120 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
38130 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
38140 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
38150 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
38160 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
38170 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
38180 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
38190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
381a0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
381b0 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
381c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
381d0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
381e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
381f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
38200 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
38210 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
38220 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
38230 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
38240 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
38250 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
38260 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
38270 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
38280 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
38290 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
382a0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
382b0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
382c0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
382d0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
382e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
382f0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
38300 4f 66 54 61 62 6c 65 28 76 2c 0a 20 20 20 20 20  OfTable(v,.     
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38320 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
38330 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  pTab, pCol->iTab
38340 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  le, pCol->iColum
38350 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
38360 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
38370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
38380 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 7