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

Artifact 00edeea62174d9fc5e010e0044f2af64233cf602:


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 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0870: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c  but do not deall
0880: 6f 63 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c  ocate.** the sel
0890: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 69 74  ect structure it
08a0: 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  self..*/.static 
08b0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08d0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
08e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
08f0: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0900: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
0910: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0920: 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSrc);.  sqlite3
0930: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0940: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  ->pWhere);.  sql
0950: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0960: 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  te(db, p->pGroup
0970: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  By);.  sqlite3Ex
0980: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0990: 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69  pHaving);.  sqli
09a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
09b0: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
09c0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  y);.  sqlite3Sel
09d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
09e0: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69  >pPrior);.  sqli
09f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0a00: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
0a10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0a20: 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
0a30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  );.  sqlite3With
0a40: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
0a50: 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ith);.}../*.** I
0a60: 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65  nitialize a Sele
0a70: 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
0a80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0a90: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
0aa0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
0ab0: 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  t, int eDest, in
0ac0: 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73  t iParm){.  pDes
0ad0: 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65  t->eDest = (u8)e
0ae0: 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69  Dest;.  pDest->i
0af0: 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  SDParm = iParm;.
0b00: 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74    pDest->affSdst
0b10: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
0b20: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b30: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
0b40: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
0b50: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
0b60: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0b70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0b80: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0b90: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0ba0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0bb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0bc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0bd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0be0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0bf0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0c00: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
0c10: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
0c20: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
0c30: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
0c40: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
0c50: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
0c60: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0c70: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0c80: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0c90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0ca0: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0cb0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0cc0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0cd0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0ce0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0cf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0d00: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
0d10: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
0d20: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
0d30: 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  6 selFlags,     
0d40: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
0d50: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
0d60: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
0d70: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20   Expr *pLimit,  
0d80: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
0d90: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0da0: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  ns not used */. 
0db0: 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20   Expr *pOffset  
0dc0: 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54         /* OFFSET
0dd0: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0de0: 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f  ans no offset */
0df0: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  .){.  Select *pN
0e00: 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61  ew;.  Select sta
0e10: 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  ndin;.  sqlite3 
0e20: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0e30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
0e40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
0e50: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
0e60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
0e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
0e80: 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c  | !pOffset || pL
0e90: 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45  imit ); /* OFFSE
0ea0: 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20  T implies LIMIT 
0eb0: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0ec0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
0ed0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ee0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26   );.    pNew = &
0ef0: 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d  standin;.    mem
0f00: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
0f10: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d  eof(*pNew));.  }
0f20: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0f30: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0f40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0f50: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
0f60: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
0f70: 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d  ,TK_ALL,0));.  }
0f80: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
0f90: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  = pEList;.  if( 
0fa0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
0fb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
0fc0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
0fd0: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
0fe0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
0ff0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
1000: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
1010: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1020: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1030: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1040: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1050: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
1090: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
10a0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
10b0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10c0: 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  set;.  assert( p
10d0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69  Offset==0 || pLi
10e0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  mit!=0 );.  pNew
10f0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
1100: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1110: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1120: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
1130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
1140: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
1150: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1160: 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  if( pNew!=&stand
1170: 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  in ) sqlite3DbFr
1180: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
1190: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
11a0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11b0: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
11c0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
11d0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
11e0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
11f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
1200: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
1210: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1220: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1230: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1240: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1250: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1260: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1270: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1280: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
1290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
12b0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
12c0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
12d0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
12e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
12f0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
1300: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
1310: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1320: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1340: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1350: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1360: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1370: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
1380: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
1390: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
13a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
13b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13c0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
13d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13e0: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a   in a compound..
13f0: 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  */.static Select
1400: 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28   *findRightmost(
1410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68  Select *p){.  wh
1420: 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20  ile( p->pNext ) 
1430: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1450: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
1460: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
1470: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
1480: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
1490: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
14a0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
14b0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
14c0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
14d0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
14e0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
14f0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
1500: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
1510: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
1520: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
1530: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
1540: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
1550: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
1560: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
1570: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
1580: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
1590: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
15a0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
15b0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
15c0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
15d0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
15e0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
15f0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
1600: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
1610: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
1620: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
1630: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
1640: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
1650: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
1660: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
1670: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
1680: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
1690: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
16a0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20  Token *p;.      
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33         /*   0123
16d0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
16e0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
16f0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1700: 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d   char zKeyText[]
1710: 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75   = "naturaleftou
1720: 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72  terightfullinner
1730: 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63  cross";.  static
1740: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1750: 20 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20      u8 i;       
1760: 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
1770: 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e   keyword text in
1780: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20   zKeyText[] */. 
1790: 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20     u8 nChar;    
17a0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
17b0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72   keyword in char
17c0: 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38  acters */.    u8
17d0: 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f   code;     /* Jo
17e0: 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a  in type mask */.
17f0: 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d    } aKeyword[] =
1800: 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61   {.    /* natura
1810: 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54  l */ { 0,  7, JT
1820: 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20  _NATURAL        
1830: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1840: 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36  * left    */ { 6
1850: 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  ,  4, JT_LEFT|JT
1860: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1870: 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20  },.    /* outer 
1880: 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54    */ { 10, 5, JT
1890: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
18a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
18b0: 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31  * right   */ { 1
18c0: 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a  4, 5, JT_RIGHT|J
18d0: 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20  T_OUTER         
18e0: 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20  },.    /* full  
18f0: 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54    */ { 19, 4, JT
1900: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
1910: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f  T_OUTER },.    /
1920: 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32  * inner   */ { 2
1930: 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20  3, 5, JT_INNER  
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20  },.    /* cross 
1960: 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54    */ { 28, 5, JT
1970: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
1980: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
1990: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
19a0: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
19b0: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
19c0: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
19d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
19e0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
19f0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
1a00: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
1a10: 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  j<ArraySize(aKey
1a20: 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  word); j++){.   
1a30: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65     if( p->n==aKe
1a40: 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a  yword[j].nChar .
1a50: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
1a60: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
1a70: 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54  ar*)p->z, &zKeyT
1a80: 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  ext[aKeyword[j].
1a90: 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  i], p->n)==0 ){.
1aa0: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
1ab0: 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e   |= aKeyword[j].
1ac0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
1ad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ae0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1af0: 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c   j==0 || j==1 ||
1b00: 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c   j==2 || j==3 ||
1b10: 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c   j==4 || j==5 ||
1b20: 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28   j==6 );.    if(
1b30: 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b   j>=ArraySize(aK
1b40: 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20  eyword) ){.     
1b50: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1b60: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1b70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1b80: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1b90: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
1ba0: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
1bb0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
1bc0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
1bd0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
1be0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
1bf0: 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a  har *zSp = " ";.
1c00: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d      assert( pB!=
1c10: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d  0 );.    if( pC=
1c20: 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20  =0 ){ zSp++; }. 
1c30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c40: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1c50: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1c60: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1c70: 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25         "%T %T%s%
1c80: 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c  T", pA, pB, zSp,
1c90: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
1ca0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
1cb0: 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e   }else if( (join
1cc0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1cd0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
1ce0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1cf0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29  _LEFT|JT_RIGHT))
1d00: 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  !=JT_LEFT ){.   
1d10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d20: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1d30: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
1d40: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
1d50: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
1d60: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1d70: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1d80: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1d90: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1db0: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1dc0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1dd0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1de0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1df0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1e00: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1e10: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1e20: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1e30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1e40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1e50: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1e60: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1e70: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1e80: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1e90: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1ea0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1eb0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1ec0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
1ed0: 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69  first N tables i
1ee0: 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66  n pSrc, from lef
1ef0: 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b  t to right, look
1f00: 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  ing for a.** tab
1f10: 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  le that has a co
1f20: 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e  lumn named zCol.
1f30: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f    .**.** When fo
1f40: 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20  und, set *piTab 
1f50: 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68  and *piCol to th
1f60: 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e  e table index an
1f70: 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a  d column index.*
1f80: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  * of the matchin
1f90: 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74  g column and ret
1fa0: 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20  urn TRUE..**.** 
1fb0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65  If not found, re
1fc0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
1fd0: 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41  tatic int tableA
1fe0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20  ndColumnIndex(. 
1ff0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
2000: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2010: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72  f tables to sear
2020: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ch */.  int N,  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2040: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
2050: 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f   in pSrc->a[] to
2060: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e   search */.  con
2070: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
2080: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2090: 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c   column we are l
20a0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
20b0: 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20  int *piTab,     
20c0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
20d0: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d  dex of pSrc->a[]
20e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
20f0: 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  piCol           
2100: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
2110: 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62  f pSrc->a[*piTab
2120: 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68  ].pTab->aCol[] h
2130: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2140: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2150: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2160: 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
2170: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2180: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
2190: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
21a0: 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a   matching zCol *
21b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69  /..  assert( (pi
21c0: 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d  Tab==0)==(piCol=
21d0: 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20  =0) );  /* Both 
21e0: 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e  or neither are N
21f0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
2200: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
2210: 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e   iCol = columnIn
2220: 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  dex(pSrc->a[i].p
2230: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
2240: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
2250: 20 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29       if( piTab )
2260: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62  {.        *piTab
2270: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70   = i;.        *p
2280: 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  iCol = iCol;.   
2290: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
22a0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
22b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22d0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
22e0: 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62   terms implied b
22f0: 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f  y JOIN syntax to
2300: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
2310: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
2320: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
2330: 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74  ement. The new t
2340: 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  erm, which.** is
2350: 20 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20   ANDed with the 
2360: 65 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63  existing WHERE c
2370: 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65  lause, is of the
2380: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
2390: 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62  (tab1.col1 = tab
23a0: 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68  2.col2).**.** wh
23b0: 65 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20  ere tab1 is the 
23c0: 69 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e  iSrc'th table in
23d0: 20 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e   SrcList pSrc an
23e0: 64 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a  d tab2 is the .*
23f0: 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43  * (iSrc+1)'th. C
2400: 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f  olumn col1 is co
2410: 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66  lumn iColLeft of
2420: 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20   tab1, and col2 
2430: 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  is.** column iCo
2440: 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a  lRight of tab2..
2450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2460: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
2470: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2490: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24a0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
24b0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
24c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
24d0: 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d  f tables in FROM
24e0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
24f0: 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   iLeft,         
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2510: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  Index of first t
2520: 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20  able to join in 
2530: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
2540: 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  olLeft,         
2550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2560: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
2570: 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  first table */. 
2580: 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20   int iRight,    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63   /* Index of sec
25b0: 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72  ond table in pSr
25c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52  c */.  int iColR
25d0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
25e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63  of column in sec
2600: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ond table */.  i
2610: 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20  nt isOuterJoin, 
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2630: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2640: 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  s an OUTER join 
2650: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  */.  Expr **ppWh
2660: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
2670: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2680: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2690: 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b   to add to */.){
26a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
26c0: 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72  xpr *pE1;.  Expr
26d0: 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70   *pE2;.  Expr *p
26e0: 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  Eq;..  assert( i
26f0: 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20  Left<iRight );. 
2700: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
2710: 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20  Src>iRight );.  
2720: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
2730: 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20  iLeft].pTab );. 
2740: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
2750: 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b  [iRight].pTab );
2760: 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65  ..  pE1 = sqlite
2770: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2780: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66  r(db, pSrc, iLef
2790: 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20  t, iColLeft);.  
27a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE2 = sqlite3Cre
27b0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
27c0: 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20  , pSrc, iRight, 
27d0: 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70  iColRight);..  p
27e0: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
27f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c  r(pParse, TK_EQ,
2800: 20 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20   pE1, pE2, 0);. 
2810: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
2820: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2830: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2840: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2850: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2860: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2870: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2880: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2890: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
28a0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
28b0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
28c0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
28d0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
28e0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
28f0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2900: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
2910: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
2920: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2930: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2940: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2950: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2960: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2970: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2980: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2990: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
29a0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
29b0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
29c0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
29d0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
29e0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
29f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2a00: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2a10: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2a20: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2a30: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2a40: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2a50: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2a60: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2a70: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2a80: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2a90: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
2aa0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
2ab0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
2ac0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
2ad0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
2ae0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
2af0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2b00: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2b10: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2b20: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2b30: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2b40: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2b50: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2b60: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2b70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b80: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2b90: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2ba0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
2bb0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
2bc0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
2bd0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
2be0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
2bf0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2c00: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2c10: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2c20: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2c30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2c40: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2c50: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2c60: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2c70: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2c80: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2c90: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
2ca0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2cb0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
2cc0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2cd0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2ce0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2cf0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2d00: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2d10: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2d20: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2d30: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2d40: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2d50: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2d60: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2d70: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2d80: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2d90: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
2da0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
2db0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2dc0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2dd0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2de0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2df0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2e00: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2e10: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2e20: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2e30: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2e40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2e50: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e60: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2e70: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2e80: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2e90: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
2ea0: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
2eb0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2ec0: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
2ed0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
2ee0: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
2ef0: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2f00: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2f10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2f20: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2f30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2f40: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2f50: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
2f60: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
2f70: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
2f80: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
2f90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
2fa0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
2fb0: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
2fc0: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
2fd0: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
2fe0: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
2ff0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
3000: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
3010: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
3020: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
3030: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
3040: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
3050: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
3060: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
3070: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
3080: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
3090: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
30a0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
30b0: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
30c0: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
30d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
30e0: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
30f0: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
3100: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
3110: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
3120: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
3130: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3140: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
3150: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
3160: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
3170: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3180: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
3190: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
31a0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
31b0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
31c0: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
31d0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
31e0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
31f0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
3200: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
3210: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
3220: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
3230: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3250: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
3260: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
3270: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
3280: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
3290: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
32a0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
32b0: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
32c0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
32d0: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
32e0: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
32f0: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
3300: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
3310: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
3320: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
3330: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
3340: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
3350: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
3360: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
3370: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
3380: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
3390: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
33a0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
33b0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
33c0: 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52  LeftTab==0 || pR
33d0: 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f  ightTab==0) ) co
33e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
33f0: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
3400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
3410: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
3420: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
3430: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
3440: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
3450: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
3460: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
3470: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
3480: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
3490: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
34a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
34b0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
34c0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
34d0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
34e0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
34f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3500: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3510: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
3520: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
3530: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
3540: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3550: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
3560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3570: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
3580: 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e  0; j<pRightTab->
3590: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
35a0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
35b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
35c0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68  lumn in the righ
35d0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
35e0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
35f0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65    /* Matching le
3600: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ft table */.    
3610: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3620: 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63  ;  /* Matching c
3630: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66  olumn in the lef
3640: 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  t table */..    
3650: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67      zName = pRig
3660: 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  htTab->aCol[j].z
3670: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
3680: 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  ( tableAndColumn
3690: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
36a0: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
36b0: 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20  &iLeftCol) ){.  
36c0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
36d0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
36e0: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
36f0: 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20  ol, i+1, j,.    
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
3720: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
3730: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3740: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
3750: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
3760: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
3770: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
3780: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3790: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
37a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
37b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
37c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
37d0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
37e0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
37f0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
3800: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
3810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3820: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3830: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
3840: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
3850: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
3860: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
3870: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
3880: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
3890: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
38a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
38b0: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
38c0: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
38d0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
38e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
38f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
3900: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3910: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
3920: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
3930: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
3940: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3950: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
3960: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
3970: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
3980: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
3990: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
39a0: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
39b0: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
39c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
39d0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
39e0: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
39f0: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
3a00: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
3a10: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
3a20: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
3a30: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
3a40: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
3a50: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
3a60: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
3a70: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
3a80: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
3a90: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
3aa0: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
3ab0: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
3ac0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
3ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3ae0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
3af0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
3b00: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
3b10: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
3b20: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
3b30: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
3b40: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3b50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3b60: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55  he term in the U
3b70: 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  SING clause */. 
3b80: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3b90: 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ;       /* Table
3ba0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74   on the left wit
3bb0: 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  h matching colum
3bc0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
3bd0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3be0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3bf0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3c00: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
3c10: 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ft */.        in
3c20: 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f  t iRightCol;   /
3c30: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3c40: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3c50: 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  mn on the right 
3c60: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
3c70: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3c80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3c90: 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d  RightCol = colum
3ca0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
3cb0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3cc0: 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c    if( iRightCol<
3cd0: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74  0.         || !t
3ce0: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3cf0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3d00: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3d10: 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  eftCol).        
3d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3d30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3d40: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
3d50: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
3d60: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
3d70: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
3d80: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
3d90: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
3da0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3db0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
3dc0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3dd0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3de0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3df0: 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c   i+1, iRightCol,
3e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e10: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
3e20: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
3e30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3e40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
3e50: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
3e60: 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  e */.static KeyI
3e70: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
3e80: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
3e90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ea0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3eb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3ec0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
3ed0: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
3ee0: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
3ef0: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
3f00: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
3f10: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
3f20: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
3f30: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
3f40: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
3f50: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3f60: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
3f70: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
3f80: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  );../*.** Genera
3f90: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
3fa0: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
3fb0: 64 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72  d in registers r
3fc0: 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67  egData.** throug
3fd0: 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d  h regData+nData-
3fe0: 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  1 onto the sorte
3ff0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4000: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
4010: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4020: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
4030: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
4040: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
4050: 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  ,        /* Info
4060: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
4070: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
4080: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
4090: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
40a0: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
40b0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
40c0: 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20   int regData,   
40d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
40e0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
40f0: 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72  g data to be sor
4100: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ted */.  int nDa
4110: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
4120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
4130: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
4140: 61 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  a array */.  int
4150: 20 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20   nPrefixReg     
4160: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65      /* No. of re
4170: 67 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61  g prior to regDa
4180: 74 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ta available for
4190: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   use */.){.  Vdb
41a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
41b0: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41d0: 20 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   Stmt under cons
41e0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
41f0: 74 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74  t bSeq = ((pSort
4200: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
4210: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
4220: 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78  )==0);.  int nEx
4230: 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  pr = pSort->pOrd
4240: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20  erBy->nExpr;    
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e            /* No.
4260: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
4270: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73  ms */.  int nBas
4280: 65 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71  e = nExpr + bSeq
4290: 20 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   + nData;       
42a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
42b0: 64 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63  ds in sorter rec
42c0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
42d0: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
4300: 73 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63  s for sorter rec
4310: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
4320: 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73  Record = ++pPars
4330: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
4350: 65 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65  embled sorter re
4360: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  cord */.  int nO
4370: 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f  BSat = pSort->nO
4380: 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  BSat;           
4390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52             /* OR
43a0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
43b0: 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  skip */.  int op
43c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43e0: 4f 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f  Opcode to add so
43f0: 72 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73  rter record to s
4400: 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  orter */..  asse
4410: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
4420: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Seq==1 );.  if( 
4430: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4440: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4450: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4460: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4470: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4480: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4490: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
44a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
44b0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
44c0: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
44d0: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
44e0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
44f0: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
4500: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 53 51  rBy, regBase, SQ
4510: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a  LITE_ECEL_DUP);.
4520: 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20    if( bSeq ){.  
4530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4540: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
4550: 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  ce, pSort->iECur
4560: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
4570: 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  pr);.  }.  if( n
4580: 50 72 65 66 69 78 52 65 67 3d 3d 30 20 29 7b 0a  PrefixReg==0 ){.
4590: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
45a0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
45b0: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
45c0: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
45d0: 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ta);.  }..  sqli
45e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
45f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4600: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
4610: 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65  nBase-nOBSat, re
4620: 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20  gRecord);.  if( 
4630: 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20  nOBSat>0 ){.    
4640: 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20  int regPrevKey; 
4650: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e    /* The first n
4660: 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  OBSat columns of
4670: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
4680: 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
4690: 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64  rFirst;    /* Ad
46a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
46b0: 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a  IfNot opcode */.
46c0: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b      int addrJmp;
46d0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
46e0: 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20   of the OP_Jump 
46f0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64  opcode */.    Vd
4700: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
4710: 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f  /* Opcode that o
4720: 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20  pens the sorter 
4730: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  */.    int nKey;
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4750: 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65  er of sorting ke
4760: 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75  y columns, inclu
4770: 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65  ding OP_Sequence
4780: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
4790: 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69  *pKI;     /* Ori
47a0: 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e  ginal KeyInfo on
47b0: 20 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c   the sorter tabl
47c0: 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65  e */..    regPre
47d0: 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vKey = pParse->n
47e0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
47f0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74  e->nMem += pSort
4800: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b  ->nOBSat;.    nK
4810: 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f  ey = nExpr - pSo
4820: 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65  rt->nOBSat + bSe
4830: 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20  q;.    if( bSeq 
4840: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72  ){.      addrFir
4850: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
4860: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
4870: 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ot, regBase+nExp
4880: 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r); .    }else{.
4890: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
48a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
48b0: 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op1(v, OP_Sequen
48c0: 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69  ceTest, pSort->i
48d0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  ECursor);.    }.
48e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
48f0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
4900: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4910: 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65  _Compare, regPre
4920: 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70  vKey, regBase, p
4930: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4940: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
4950: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f  VdbeGetOp(v, pSo
4960: 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65  rt->addrSortInde
4970: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  x);.    if( pPar
4980: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4990: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
49a0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65     pOp->p2 = nKe
49b0: 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70  y + nData;.    p
49c0: 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  KI = pOp->p4.pKe
49d0: 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65  yInfo;.    memse
49e0: 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65  t(pKI->aSortOrde
49f0: 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c  r, 0, pKI->nFiel
4a00: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
4a10: 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61  Jump below testa
4a20: 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ble */.    sqlit
4a30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
4a40: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49  , -1, (char*)pKI
4a50: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
4a60: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
4a70: 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
4a80: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
4a90: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4aa0: 79 2c 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20  y, nOBSat, 1);. 
4ab0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4ac0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4ad0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4af0: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4b00: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4b10: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4b20: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4b30: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4b40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4b50: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4b60: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4b70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
4b80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b90: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
4ba0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4bb0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
4bc0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
4bd0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4be0: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
4bf0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4c10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4c20: 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  First);.    sqli
4c30: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
4c40: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
4c50: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4c60: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4c80: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4ca0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4cb0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4cc0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4cd0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4cf0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4d00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4d10: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4d20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4d30: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4d40: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4d50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4d60: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4d70: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4d80: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4d90: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4da0: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4db0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4dc0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4dd0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4de0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4df0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4e00: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4e10: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4e40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4e50: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4e60: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4e80: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4e90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4ea0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ec0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4ed0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ef0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4f00: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4f10: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4f20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4f30: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4f50: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4f60: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4f70: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4f80: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4fa0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4fb0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4fc0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4fd0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4fe0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4ff0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
5000: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
5010: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5020: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
5030: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
5040: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
5050: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
5060: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5070: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
5080: 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c  Neg, iOffset, 0,
5090: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
50a0: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
50b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
50c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
50d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
50e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
50f0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
5100: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
5110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5120: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
5130: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
5140: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
5150: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
5160: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
5170: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5180: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5190: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
51a0: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
51b0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
51c0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
51d0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
51e0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
51f0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5200: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5210: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5220: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5230: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5240: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5250: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5260: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5270: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5280: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5290: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
52a0: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
52b0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
52c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
52d0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
52e0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
52f0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5300: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5310: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5320: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5330: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5340: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5350: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5360: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5370: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5380: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
53a0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
53b0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
53c0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
53d0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
53e0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
53f0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5400: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5410: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5420: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5430: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5440: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5450: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5460: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5470: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5490: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
54a0: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
54d0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
54e0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
54f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5500: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
5510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5520: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
5530: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
5540: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
5550: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5560: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5570: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5580: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5590: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
55a0: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
55b0: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
55c0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
55d0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
55e0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
55f0: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
5600: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
5610: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
5620: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
5630: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
5640: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
5650: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5660: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5670: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5690: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
56a0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
56b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
56c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
56d0: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
56e0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
56f0: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
5700: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
5710: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
5720: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
5730: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
5740: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
5750: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5760: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5770: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5780: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5790: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
57a0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
57b0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
57c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
57d0: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
57e0: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
57f0: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
5800: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
5810: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5820: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
5830: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5840: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5850: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5870: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5880: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5890: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
58a0: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
58b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
58c0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
58d0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
58e0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
58f0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
5900: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
5910: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
5920: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
5930: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
5940: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
5950: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5960: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5970: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5980: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5990: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
59a0: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
59b0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
59c0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
59d0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
59e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
59f0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
5a00: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5a10: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5a20: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5a30: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5a40: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5a50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5a60: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5a70: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5a80: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5a90: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
5ab0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
5ac0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
5ad0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
5ae0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
5af0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5b00: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5b10: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5b20: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5b30: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5b40: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5b50: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5b60: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5b70: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5b80: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5b90: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5ba0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
5bb0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
5bc0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
5bd0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
5be0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
5bf0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
5c00: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5c10: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5c20: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5c30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5c40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5c50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5c60: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5c70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5c80: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5c90: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5ca0: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5cc0: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5cd0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5ce0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5cf0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5d00: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
5d10: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
5d20: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5d30: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
5d40: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
5d50: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5d60: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5d70: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5d80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5d90: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5da0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
5db0: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
5dc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5dd0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
5de0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
5df0: 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  lt */..  assert(
5e00: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
5e10: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
5e20: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
5e30: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
5e40: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
5e50: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
5e60: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
5e70: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
5e80: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
5e90: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
5ea0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
5eb0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
5ec0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
5ed0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
5ee0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
5ef0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
5f00: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
5f10: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
5f20: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
5f30: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5f40: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
5f50: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
5f60: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
5f70: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
5f80: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5f90: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
5fa0: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
5fb0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5fc0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
5fd0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
5fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5ff0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
6000: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
6010: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
6020: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
6030: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6040: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
6050: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
6060: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
6070: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
6080: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
6090: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
60a0: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
60b0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
60c0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
60d0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
60e0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
60f0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
6100: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
6110: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
6120: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
6130: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
6140: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
6150: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
6160: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
6170: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
6180: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
6190: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
61a0: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
61b0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
61c0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
61d0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
61e0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
61f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6200: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6210: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6220: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6230: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
6240: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6250: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6260: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6270: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6280: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6290: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
62a0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
62b0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
62c0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
62d0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
62e0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
62f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
6300: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
6310: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
6320: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6330: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
6340: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
6350: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
6360: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
6370: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
6380: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
6390: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
63a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
63b0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
63c0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
63d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
63e0: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
63f0: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
6400: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
6410: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
6420: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6430: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6440: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6450: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6460: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6470: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6480: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6490: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
64a0: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
64b0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
64c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
64d0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
64e0: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
64f0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
6500: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6510: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6520: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6530: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6540: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6550: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6560: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6580: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6590: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
65a0: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
65b0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
65c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
65d0: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
65e0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
65f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
6600: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6610: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6620: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6630: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6640: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6650: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6660: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6670: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6680: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6690: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
66a0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
66b0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
66c0: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
66d0: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
66e0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
66f0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
6700: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6710: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6720: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6730: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6740: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6750: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6760: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6770: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6780: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6790: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
67a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
67b0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
67c0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
67d0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
67e0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
67f0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
6800: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6810: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6820: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6830: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6840: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6850: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6860: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6870: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6880: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6890: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
68a0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
68b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
68c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
68d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
68e0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
68f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
6900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
6910: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
6920: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6940: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
6950: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6960: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6970: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6980: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
69a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
69b0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
69c0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
69d0: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
69e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
69f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a20: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6a30: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6a40: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6a60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6a70: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6a80: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6a90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6aa0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
6ab0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c  Addr(v)==iJump |
6ac0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
6ad0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6af0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
6b00: 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72  py, regResult, r
6b10: 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43  egPrev, nResultC
6b20: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ol-1);.        b
6b30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6b40: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6b50: 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
6b60: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6b70: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
6b80: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
6b90: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6bb0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
6bc0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
6bd0: 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ert( pDistinct->
6be0: 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
6bf0: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
6c00: 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63  RED );.        c
6c10: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
6c20: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74  se, pDistinct->t
6c30: 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  abTnct, iContinu
6c40: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  e, nResultCol, r
6c50: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6c70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6c80: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6c90: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6ca0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6cb0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6cc0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6cd0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6ce0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6cf0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6d00: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6d10: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6d20: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6d30: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6d40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6d50: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6d60: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6d70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6d80: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6d90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6da0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6db0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6dc0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6dd0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6de0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6e00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6e10: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6e20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6e30: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6e40: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6e60: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6e70: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6e80: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6e90: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6ea0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6eb0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6ec0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6ed0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6ee0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ef0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
6f00: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
6f10: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
6f20: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6f30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6f40: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
6f50: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
6f60: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6f70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6f80: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6f90: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6fa0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
6fb0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
6fc0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
6fd0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
6fe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6ff0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7000: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
7010: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
7020: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
7030: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
7040: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
7050: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
7060: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
7070: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
7080: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
7090: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
70a0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
70b0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
70c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
70d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
70e0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
70f0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7100: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
7110: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7120: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
7130: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7140: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
7150: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
7160: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
7170: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
7180: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
7190: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
71a0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
71b0: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
71c0: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
71d0: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
71e0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
71f0: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
7200: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
7210: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
7220: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
7230: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
7240: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
7250: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
7260: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
7270: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
7280: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
7290: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
72a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
72b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
72c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
72d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
72e0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
72f0: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
7300: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7320: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7330: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7340: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
7350: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7370: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7380: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7390: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
73a0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
73b0: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
73c0: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
73d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
73e0: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
73f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7400: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7420: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7430: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
7440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7450: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7460: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7470: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
7480: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7490: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
74a0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
74b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
74c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
74d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
74e0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
74f0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7500: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
7510: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7520: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7540: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
7550: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
7560: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
7570: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
7580: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
7590: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
75a0: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
75b0: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
75c0: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
75d0: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
75e0: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
75f0: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
7600: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7610: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7620: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
7630: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
7640: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
7650: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
7660: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
7670: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
7680: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
7690: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
76a0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
76b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
76c0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
76d0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
76e0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
76f0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
7700: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
7710: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
7720: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
7730: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
7740: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
7750: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
7760: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
7770: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
7780: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
7790: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
77a0: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
77b0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
77c0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
77d0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
77e0: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
77f0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7800: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7810: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7820: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7840: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7850: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7860: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
7870: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
7880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7890: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
78a0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
78b0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
78c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
78d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
78e0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
78f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7900: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7910: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7930: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7940: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7950: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7960: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
7970: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
7980: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7990: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
79a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
79b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
79c0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
79d0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
79e0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
79f0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
7a00: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7a20: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7a30: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7a40: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7a50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7a60: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
7a70: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
7a80: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
7a90: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
7aa0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
7ab0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
7ac0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
7ad0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
7ae0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7af0: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
7b00: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7b20: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7b30: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7b40: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
7b50: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7b60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7b70: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
7b80: 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  iParm );.       
7b90: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
7ba0: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
7bb0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
7bc0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
7bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7be0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
7bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7c00: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
7c10: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
7c20: 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20  utine:       /* 
7c30: 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63  Send data to a c
7c40: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
7c50: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
7c60: 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  : {        /* Re
7c70: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
7c80: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
7c90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
7ca0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
7cb0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7cc0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
7cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7cf0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7d00: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7d10: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7d20: 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b  ol, nPrefixReg);
7d30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7d40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7d50: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
7d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d70: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7d80: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
7d90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
7dc0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
7dd0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7de0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7df0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7e00: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7e10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7e20: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
7e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7e40: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7e50: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7e60: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
7e70: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
7e80: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
7e90: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
7ea0: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
7eb0: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
7ec0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
7ed0: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
7ee0: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
7ef0: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
7f00: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
7f10: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
7f20: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
7f30: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
7f40: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
7f50: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
7f60: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
7f70: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
7f80: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
7f90: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
7fa0: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
7fb0: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
7fc0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
7fd0: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
7fe0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7ff0: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
8000: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
8010: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
8020: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
8030: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
8040: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
8050: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
8060: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
8070: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
8080: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
8090: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
80a0: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
80b0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
80c0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
80d0: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
80e0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
80f0: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
8100: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
8110: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
8120: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8130: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
8140: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
8150: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
8160: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
8170: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
8180: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
8190: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
81a0: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
81b0: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
81c0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
81d0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
81e0: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
81f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
8200: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
8210: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8220: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8230: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8260: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8270: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8280: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
82a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
82b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82c0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82d0: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
82e0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
82f0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
8300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8310: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8320: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8330: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8340: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8350: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8360: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8370: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8380: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8390: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
83a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
83b0: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
83e0: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
83f0: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8440: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8450: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8470: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8480: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8490: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
84a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
84c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
84d0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
84e0: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
84f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8500: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
8510: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8520: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8540: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8550: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
8560: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
8570: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8580: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8590: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
85a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
85b0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
85c0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
85d0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
85e0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
85f0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
8600: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
8610: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
8620: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
8630: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
8640: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
8650: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
8660: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
8670: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
8680: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
8690: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
86a0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
86b0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
86c0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
86d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
86e0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
86f0: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
8700: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8710: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
8720: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8730: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
8740: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
8750: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
8760: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
8770: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
8780: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
8790: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
87a0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
87b0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
87c0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
87d0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
87e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
87f0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
8800: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8810: 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , -1); VdbeCover
8820: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
8830: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
8840: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
8850: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
8860: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
8870: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
8880: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
8890: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
88a0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
88b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
88c0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65   N, int X){.  Ke
88d0: 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74  yInfo *p = sqlit
88e0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30  e3DbMallocZero(0
88f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8900: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79        sizeof(Key
8910: 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73  Info) + (N+X)*(s
8920: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
8930: 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  1));.  if( p ){.
8940: 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
8950: 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f  r = (u8*)&p->aCo
8960: 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e  ll[N+X];.    p->
8970: 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b  nField = (u16)N;
8980: 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20  .    p->nXField 
8990: 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d  = (u16)X;.    p-
89a0: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
89b0: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
89c0: 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
89d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
89e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
89f0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
8a00: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
8a10: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
8a20: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
8a30: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
8a40: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
8a50: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8a60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8a70: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8a80: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
8a90: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
8aa0: 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20  3DbFree(0, p);. 
8ab0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
8ac0: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
8ad0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
8ae0: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
8af0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
8b00: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
8b10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8b20: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
8b30: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
8b40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8b50: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8b60: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
8b70: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
8b80: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
8b90: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
8ba0: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
8bb0: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
8bc0: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
8bd0: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
8be0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
8bf0: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
8c00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8c10: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
8c20: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8c30: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
8c40: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
8c50: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
8c60: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
8c70: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
8c80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
8c90: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
8ca0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
8cb0: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
8cc0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
8cd0: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
8ce0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
8cf0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
8d00: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
8d10: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
8d20: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
8d30: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
8d40: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
8d50: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
8d60: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
8d70: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
8d80: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
8d90: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
8da0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
8db0: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
8dc0: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
8dd0: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
8de0: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
8df0: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
8e00: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
8e10: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8e20: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
8e30: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
8e40: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
8e50: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
8e60: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
8e70: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
8e80: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
8e90: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8ea0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
8eb0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
8ec0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
8ed0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
8ee0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
8ef0: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
8f00: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
8f10: 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
8f20: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
8f30: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
8f40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8f50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8f60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
8f70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
8f80: 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79   /* Form the Key
8f90: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Info object from
8fa0: 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a   this ExprList *
8fb0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
8fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
8fd0: 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75  n with this colu
8fe0: 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20  mn of pList */. 
8ff0: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
9000: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
9010: 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c  s many extra col
9020: 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umns to the end 
9030: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  */.){.  int nExp
9040: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
9050: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
9060: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9070: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
9080: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9090: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
90a0: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
90b0: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
90c0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
90d0: 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72 61  db, nExpr+nExtra
90e0: 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 69  -iStart, 1);.  i
90f0: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
9100: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
9110: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
9120: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
9130: 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49  for(i=iStart, pI
9140: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74  tem=pList->a+iSt
9150: 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  art; i<nExpr; i+
9160: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
9170: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9180: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
9190: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
91a0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
91b0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
91c0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
91d0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
91e0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
91f0: 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74  ->aColl[i-iStart
9200: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
9210: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
9220: 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70  er[i-iStart] = p
9230: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
9240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9250: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69  urn pInfo;.}..#i
9260: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9270: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9280: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
9290: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
92a0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
92b0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
92c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
92d0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
92e0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
92f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
9300: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9310: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9320: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
9330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9340: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9350: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9360: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9370: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
9380: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
93a0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
93b0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
93c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
93d0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
93e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
93f0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9400: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
9410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9420: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
9430: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9440: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9450: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9460: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9470: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9480: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9490: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
94a0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
94b0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
94c0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
94d0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
94e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
94f0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
9500: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
9510: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
9520: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
9530: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
9540: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
9550: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
9560: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
9570: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
9580: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9590: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
95a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
95b0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
95c0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
95d0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
95e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
95f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
9600: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
9610: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
9620: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
9630: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
9640: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
9650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
9660: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
9670: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
9680: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
9690: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
96a0: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
96b0: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
96c0: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
96d0: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
96e0: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
96f0: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
9700: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
9710: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
9720: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
9730: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
9740: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
9750: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
9760: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
9770: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
9780: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
9790: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
97a0: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
97b0: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
97c0: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
97d0: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
97e0: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
97f0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9800: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
9810: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
9820: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9830: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
9840: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
9850: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
9860: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
9870: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
9880: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9890: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
98a0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
98b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
98c0: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
98d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
98e0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
98f0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
9900: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9910: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9920: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9930: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9940: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9950: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9960: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9970: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9980: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9990: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
99a0: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
99b0: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
99c0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
99d0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
99e0: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
99f0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
9a00: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9a10: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
9a20: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
9a30: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
9a40: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
9a50: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
9a60: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
9a70: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
9a80: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
9a90: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
9aa0: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
9ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
9ac0: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
9ad0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
9ae0: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
9af0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
9b00: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9b10: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
9b20: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
9b30: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9b40: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
9b50: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
9b60: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
9b70: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
9b80: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
9b90: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
9ba0: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
9bb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9bd0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
9be0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
9c10: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
9c20: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
9c30: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
9c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
9c50: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
9c60: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
9c90: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
9ca0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
9cb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9cc0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
9cd0: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
9ce0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
9cf0: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
9d00: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
9d10: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
9d20: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
9d30: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9d40: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9d50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9d60: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9d70: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9d80: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
9d90: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
9da0: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
9db0: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
9dc0: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
9dd0: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
9de0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9df0: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
9e00: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
9e10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9e20: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9e30: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9e40: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9e50: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9e60: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
9e70: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
9e80: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
9e90: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
9ea0: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
9eb0: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
9ec0: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
9ed0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
9ee0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
9ef0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
9f00: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
9f10: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
9f20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
9f30: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
9f40: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
9f50: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
9f60: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
9f70: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
9f80: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
9f90: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
9fa0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
9fb0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
9fc0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
9fd0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
9fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9ff0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
a000: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
a010: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a020: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
a030: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a040: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
a050: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f  tatement */.  So
a060: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
a070: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  /* Information o
a080: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
a090: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
a0a0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
a0b0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a0c0: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
a0d0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
a0e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
a0f0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
a100: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
a110: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a130: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
a140: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a150: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
a160: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
a170: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
a180: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a190: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
a1a0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
a1b0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
a1c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
a1d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
a1e0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
a1f0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
a200: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
a210: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
a220: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a230: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
a240: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
a250: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
a260: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
a270: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
a280: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
a290: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
a2a0: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
a2b0: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
a2c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
a2d0: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
a2e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
a2f0: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
a300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a310: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
a320: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
a330: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
a340: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
a370: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
a380: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69  s seq. no. */.#i
a390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a3a0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a3b0: 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70  NTS.  struct Exp
a3c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
a3d0: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
a3e0: 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  a;.#endif..  if(
a3f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a400: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
a410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a420: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
a430: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
a440: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
a450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a460: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
a470: 20 30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   0, addrBreak);.
a480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
a490: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
a4a0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a4b0: 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20  );.  }.  iTab = 
a4c0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
a4d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
a4e0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
a4f0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
a500: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
a510: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
a520: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
a530: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
a540: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
a550: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
a560: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a570: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a580: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
a590: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a5a0: 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  se);.    nSortDa
a5b0: 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b  ta = 1;.  }.  nK
a5c0: 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ey = pOrderBy->n
a5d0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
a5e0: 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72  BSat;.  if( pSor
a5f0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
a600: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
a610: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
a620: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
a630: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53  se->nMem;.    iS
a640: 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ortTab = pParse-
a650: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28  >nTab++;.    if(
a660: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a670: 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  ut ){.      addr
a680: 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  Once = sqlite3Co
a690: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
a6a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a6c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a6d0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
a6e0: 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74  SortTab, regSort
a6f0: 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72  Out, nKey+1+nSor
a700: 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  tData);.    if( 
a710: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
a720: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a730: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
a740: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
a750: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a760: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
a770: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
a780: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
a790: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a7a0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a7b0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a7c0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
a7d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a7e0: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
a7f0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
a800: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
a810: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
a820: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a840: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
a850: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
a860: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a870: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
a880: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
a890: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
a8a0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
a8b0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
a8c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
a8d0: 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29  <nSortData; i++)
a8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a8f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
a900: 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20  lumn, iSortTab, 
a910: 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67  nKey+bSeq+i, reg
a920: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65  Row+i);.    Vdbe
a930: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
a940: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
a950: 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  e ? aOutEx[i].zN
a960: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
a970: 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73  zSpan));.  }.  s
a980: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
a990: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
a9a0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
a9b0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
a9c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a9d0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
a9e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a9f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
aa00: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
aa10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aa20: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
aa30: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
aa40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aa50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa60: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
aa70: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
aa80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aa90: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
aaa0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
aab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aac0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
aad0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
aae0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
aaf0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
ab00: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
ab10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab20: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
ab30: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
ab40: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20   1, regRowid,.  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66        &pDest->af
ab70: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
ab80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ab90: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
aba0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
abb0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
abc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
abd0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
abe0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
abf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac00: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
ac10: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
ac20: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
ac30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ac40: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
ac50: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
ac60: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
ac70: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
ac80: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
ac90: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
aca0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
acb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
acc0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
acd0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
ace0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
acf0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
ad00: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
ad10: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
ad20: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
ad30: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ad40: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ad50: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
ad60: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
ad70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ad80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ad90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
ada0: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
adb0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
adc0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
add0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
ade0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
adf0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
ae00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae20: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ae30: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ae40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ae50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ae60: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ae70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
ae80: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
ae90: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
aea0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
aeb0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
aec0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a   regRowid);.  }.
aed0: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
aee0: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
aef0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
af00: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
af10: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69  drContinue);.  i
af20: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
af30: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
af40: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
af50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af60: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
af70: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
af80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
af90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
afa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
afb0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
afc0: 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  b, addr); VdbeCo
afd0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
afe0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52   if( pSort->regR
aff0: 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56  eturn ) sqlite3V
b000: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b010: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72  Return, pSort->r
b020: 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c  egReturn);.  sql
b030: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b040: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
b050: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  k);.}../*.** Ret
b060: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b070: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
b080: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
b090: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
b0a0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
b0b0: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
b0c0: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
b0d0: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
b0e0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
b0f0: 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74   Also try to est
b100: 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f  imate the size o
b110: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
b120: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
b130: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
b140: 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a  n *pEstWidth..**
b150: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
b160: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
b170: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
b180: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
b190: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
b1a0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
b1b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
b1c0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b1d0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
b1e0: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
b1f0: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
b200: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
b210: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
b220: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
b230: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b240: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
b250: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
b260: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
b270: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
b280: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
b290: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
b2a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
b2b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
b2c0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
b2d0: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
b2e0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
b2f0: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
b300: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b310: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b320: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b330: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b340: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
b350: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
b360: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
b370: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
b380: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
b390: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
b3a0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
b3b0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
b3c0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  umn is NULL..**.
b3d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b3e0: 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20  has either 3 or 
b3f0: 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70  6 parameters dep
b400: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
b410: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
b420: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
b430: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f  LUMN_METADATA co
b440: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
b450: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  n is used..*/.#i
b460: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b470: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b480: 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  TA.# define colu
b490: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b4a0: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b4b0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a  pl(A,B,C,D,E,F).
b4c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b4d0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
b4e0: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
b4f0: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
b500: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
b510: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
b520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
b530: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
b540: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
b550: 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  ol,.  u8 *pEstWi
b560: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
b570: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
b580: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
b590: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
b5a0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b5b0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20  gCol = 0;.#else 
b5c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
b5d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b5e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
b5f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b600: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b610: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b620: 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63  (A,B,F).static c
b630: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b640: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b650: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b660: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
b670: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
b680: 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  {.#endif /* !def
b690: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
b6a0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b6b0: 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  TA) */.  char co
b6c0: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
b6d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
b6e0: 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69  tWidth = 1;..  i
b6f0: 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
b700: 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  0) || pNC->pSrcL
b710: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
b720: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
b730: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
b740: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
b750: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
b760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
b770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
b790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
b7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
b7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
b7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
b7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
b7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
b7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
b800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
b810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
b820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
b860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
b870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
b880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
b8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
b8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
b8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
b8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
b8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
b900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
b910: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b920: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
b930: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b940: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
b950: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b960: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
b970: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
b980: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
b990: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
b9a0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
b9b0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
b9c0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
b9d0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
b9e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
b9f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
ba00: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
ba10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
ba20: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
ba30: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
ba40: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
ba50: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
ba60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ba70: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
ba80: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
ba90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
baa0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
bab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
bac0: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
bad0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
bae0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
baf0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
bb00: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
bb10: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
bb20: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
bb30: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
bb40: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
bb50: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
bb60: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
bb70: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
bb80: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
bb90: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
bba0: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
bbb0: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
bbc0: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
bbd0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
bbe0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
bbf0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
bc00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
bc10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
bc20: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
bc30: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
bc40: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
bc50: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
bc60: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bc70: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
bc80: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bc90: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
bca0: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
bcb0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
bcc0: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
bcd0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
bce0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
bcf0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
bd00: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
bd10: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
bd20: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
bd30: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bd40: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
bd50: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
bd60: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
bd70: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
bd80: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
bd90: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
bda0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
bdb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
bdc0: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
bdd0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
bde0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
bdf0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
be00: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
be10: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
be20: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
be30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be40: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
be50: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
be60: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
be70: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
be80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
be90: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
bea0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
beb0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
bec0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
bed0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
bee0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
bef0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
bf00: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
bf10: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
bf20: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
bf30: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
bf40: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
bf50: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
bf60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
bf70: 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
bf80: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
bf90: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
bfa0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
bfb0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
bfc0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
bfd0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
bfe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
bff0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
c000: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
c010: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
c020: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
c030: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
c040: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
c050: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
c060: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
c070: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c080: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c090: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
c0a0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c0b0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
c0c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
c0d0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c0e0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
c0f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
c100: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
c110: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
c120: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
c130: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c140: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
c150: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
c160: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
c170: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  dth); .        }
c180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c190: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
c1a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
c1b0: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
c1c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
c1d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c1e0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
c1f0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
c200: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
c210: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
c220: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
c230: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
c240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c250: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c260: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
c280: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
c290: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c2a0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
c2b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c2c0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c2d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c2e0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
c2f0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
c300: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
c310: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
c320: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c330: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c340: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c350: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
c360: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
c370: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
c380: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
c390: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c3a0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c3b0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
c3c0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c3d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c3e0: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
c3f0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
c400: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
c410: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
c420: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c430: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
c440: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
c450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c460: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c470: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c480: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c490: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c4a0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c4b0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
c4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c4d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
c4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c4f0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
c500: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
c510: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
c520: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
c530: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
c540: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c550: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
c560: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
c570: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
c580: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
c590: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
c5a0: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
c5b0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
c5c0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c5d0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
c5e0: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
c5f0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
c600: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c610: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c620: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
c630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
c640: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
c650: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
c660: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c670: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
c680: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c690: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
c6a0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
c6b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
c6c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c6d0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c6e0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c6f0: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c710: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
c720: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c730: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c740: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
c750: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
c760: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
c770: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
c780: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
c790: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
c7a0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
c7b0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
c7c0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
c7d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
c7e0: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
c7f0: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
c800: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
c810: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c820: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c830: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
c840: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c850: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
c860: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
c870: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
c880: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
c890: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
c8a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
c8b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
c8c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
c8d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
c8e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
c8f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c900: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
c910: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
c920: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
c930: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
c940: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
c950: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c960: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
c970: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
c980: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
c990: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
c9a0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
c9b0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
c9c0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
c9d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
c9e0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
c9f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ca00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
ca10: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
ca20: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
ca30: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
ca40: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
ca50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
ca60: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
ca70: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
ca80: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
ca90: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
caa0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cab0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
cac0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
cad0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
cae0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
caf0: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
cb00: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
cb10: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
cb20: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
cb30: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
cb40: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
cb50: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
cb60: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
cb70: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
cb80: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
cb90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cba0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
cbb0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
cbc0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
cbd0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
cbe0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
cbf0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
cc00: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
cc10: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
cc20: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
cc30: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cc40: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
cc50: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
cc60: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
cc70: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
cc80: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
cc90: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
cca0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
ccb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ccc0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ccd0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
cce0: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
ccf0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
cd00: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
cd10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
cd20: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
cd30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cd40: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cd50: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
cd60: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
cd70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
cd80: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
cd90: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
cda0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
cdb0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
cdc0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
cdd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cde0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
cdf0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
ce00: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
ce10: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
ce20: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
ce30: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ce40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ce50: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
ce60: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
ce70: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
ce80: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
ce90: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cea0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
ceb0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
cec0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ced0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
cee0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
cef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cf00: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
cf10: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
cf20: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
cf30: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
cf40: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
cf50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cf60: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
cf70: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
cf80: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
cf90: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
cfa0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
cfb0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
cfc0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
cfd0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
cfe0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
cff0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
d000: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
d010: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
d020: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
d030: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
d040: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
d050: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
d060: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d070: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d080: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
d090: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
d0a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
d0b0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
d0c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
d0d0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
d0e0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
d0f0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
d100: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
d110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d120: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d130: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d140: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
d150: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
d160: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
d170: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
d180: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
d190: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
d1a0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
d1b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
d1c0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
d1d0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
d1e0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
d1f0: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
d200: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
d210: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d220: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
d230: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
d240: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
d250: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
d260: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
d270: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
d280: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
d290: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
d2a0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
d2b0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
d2c0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
d2d0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
d2e0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
d2f0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
d300: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d310: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
d320: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
d330: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d340: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
d350: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
d360: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
d370: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
d380: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
d390: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d3a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d3b0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
d3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
d3d0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
d3e0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
d3f0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d400: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d410: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
d420: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
d440: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
d450: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
d460: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
d470: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
d480: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d490: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4a0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4b0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d4f0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d500: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d510: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
d520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
d540: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d550: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
d560: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
d570: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
d580: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
d590: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
d5a0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
d5b0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d5c0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d5d0: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
d5e0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
d5f0: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
d600: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
d610: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
d620: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
d630: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
d640: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d650: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d660: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d670: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d680: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d690: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d6a0: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d6b0: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d6c0: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d6d0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d6e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d6f0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d700: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d710: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d720: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d730: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d740: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d750: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d760: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d770: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d780: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d790: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d7a0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d7b0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d7c0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d7d0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d7e0: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d7f0: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d800: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d810: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d820: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d830: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d840: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d850: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d860: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d870: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d880: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d890: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d8a0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d8b0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d8c0: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d8d0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d8e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d8f0: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d900: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d910: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d920: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d930: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d950: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d960: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d970: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d980: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d990: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d9a0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d9b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d9c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d9d0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
d9e0: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
d9f0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
da00: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
da10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
da20: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
da30: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
da40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
da50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
da60: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
da70: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
da80: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
da90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
daa0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
dab0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
dac0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
dad0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
dae0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
daf0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
db00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
db10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
db20: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
db30: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
db40: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
db50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
db60: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
db70: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
db80: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
db90: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
dba0: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
dbb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
dbc0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
dbd0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
dbe0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
dbf0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
dc00: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
dc10: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
dc20: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
dc30: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
dc40: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
dc50: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
dc60: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
dc70: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
dc80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
dc90: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
dca0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
dcb0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
dcc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
dcd0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
dce0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
dcf0: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
dd00: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
dd10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dd20: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dd30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
dd40: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
dd50: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
dd60: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
dd70: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
dd80: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
dd90: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
dda0: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
ddb0: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
ddc0: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
ddd0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
dde0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
ddf0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
de00: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
de10: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
de20: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
de30: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
de40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
de50: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
de60: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
de70: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
de80: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
de90: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
dea0: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
deb0: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
dec0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
ded0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
dee0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
def0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
df00: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
df10: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
df20: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
df30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
df40: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
df50: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
df60: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
df70: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
df80: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
df90: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
dfa0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
dfb0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
dfc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
dfd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
dfe0: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
dff0: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
e000: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
e010: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
e020: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
e030: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
e040: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
e050: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
e060: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
e070: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
e080: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
e090: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
e0a0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e0b0: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
e0c0: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
e0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
e0e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e0f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e100: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
e110: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e120: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
e130: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
e140: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
e150: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
e160: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
e170: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
e180: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e190: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e1a0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e1b0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
e1c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e1d0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
e1e0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
e1f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
e200: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
e210: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
e220: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
e230: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
e240: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
e250: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
e260: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
e270: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
e280: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
e290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d  .        if( k>=
e2a0: 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27  0 && zName[k]=='
e2b0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
e2c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
e2d0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
e2e0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
e2f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e300: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
e310: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
e320: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e330: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e340: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
e350: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
e360: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
e370: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
e380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e390: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
e3a0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
e3b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e3c0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
e3d0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
e3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e3f0: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
e400: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
e410: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e420: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
e430: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
e440: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
e450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e460: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
e470: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e480: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
e490: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
e4a0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
e4b0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
e4c0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
e4d0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
e4e0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
e4f0: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
e500: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
e510: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
e520: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
e530: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
e540: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
e550: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
e560: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
e570: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
e580: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
e590: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e5a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e5b0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
e5c0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
e5d0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
e5e0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
e5f0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
e600: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
e610: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
e620: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
e630: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e640: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e650: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
e660: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e670: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
e680: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
e690: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
e6a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e6b0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
e6c0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
e6d0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
e6e0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
e6f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e700: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
e710: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e720: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
e730: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
e740: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
e750: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
e760: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
e770: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
e780: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
e790: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
e7a0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
e7b0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
e7c0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
e7d0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e7e0: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
e7f0: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
e800: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e810: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e820: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
e830: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
e840: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
e850: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
e860: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e870: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
e880: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
e890: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
e8a0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
e8b0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e8c0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
e8d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
e8e0: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
e8f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
e900: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
e910: 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73  ,0,0,0, &pCol->s
e920: 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c  zEst));.    szAl
e930: 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  l += pCol->szEst
e940: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
e950: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
e960: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
e970: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
e980: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
e990: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
e9a0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
e9b0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
e9c0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e9d0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
e9e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
e9f0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
ea00: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ea10: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
ea20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
ea30: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
ea40: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
ea50: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
ea60: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
ea70: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
ea80: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
ea90: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
eaa0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
eab0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
eac0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
ead0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
eae0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
eaf0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
eb00: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
eb10: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
eb20: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
eb30: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
eb40: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
eb50: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
eb60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
eb70: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
eb80: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
eb90: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
eba0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
ebb0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
ebc0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
ebd0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ebe0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
ebf0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
ec00: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
ec10: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
ec20: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
ec30: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
ec40: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
ec50: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ec60: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
ec70: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
ec80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ec90: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
eca0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ecb0: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
ecc0: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
ecd0: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
ece0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
ecf0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
ed00: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
ed10: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
ed20: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
ed30: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
ed40: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
ed50: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
ed60: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
ed70: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
ed80: 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75   );.  selectColu
ed90: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
eda0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
edb0: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
edc0: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
edd0: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
ede0: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
edf0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
ee00: 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab, pSelect);.  
ee10: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
ee20: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
ee30: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ee40: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
ee50: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
ee60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ee70: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
ee80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ee90: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
eea0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
eeb0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
eec0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
eed0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
eee0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
eef0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
ef00: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
ef10: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
ef20: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
ef30: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
ef40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ef50: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
ef60: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
ef70: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
ef80: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
ef90: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
efa0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
efb0: 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29  dOp0(v, OP_Init)
efc0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
efd0: 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20  ->pToplevel==0. 
efe0: 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
eff0: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
f000: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
f010: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20  torOutConst).   
f020: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
f030: 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
f040: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  = 1;.    }..  }.
f050: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
f060: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
f070: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
f080: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
f090: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
f0a0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
f0b0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
f0c0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
f0d0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
f0e0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
f0f0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
f100: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
f110: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
f120: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
f130: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
f140: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
f150: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
f160: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
f170: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f180: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
f190: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
f1a0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
f1b0: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
f1c0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
f1d0: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
f1e0: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
f1f0: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
f200: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
f210: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
f220: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
f230: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
f240: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
f250: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
f260: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f270: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
f280: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
f290: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
f2a0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
f2b0: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
f2c0: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
f2d0: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
f2e0: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
f2f0: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
f300: 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
f310: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
f320: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
f330: 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
f340: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
f350: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f360: 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
f370: 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
f380: 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
f390: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
f3a0: 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
f3b0: 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
f3c0: 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
f3d0: 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
f3e0: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
f3f0: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
f400: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
f410: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
f420: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
f430: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
f440: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
f450: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
f460: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
f470: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
f480: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
f490: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
f4a0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
f4b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
f4c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f4d0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
f4e0: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
f4f0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
f500: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
f510: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
f520: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
f530: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
f540: 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66  t addr1, n;.  if
f550: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
f560: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
f570: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
f580: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
f590: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
f5a0: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
f5b0: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
f5c0: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
f5d0: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
f5e0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
f5f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
f600: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
f610: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
f620: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
f630: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f640: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
f650: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
f660: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c  fset==0 || p->pL
f670: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  imit!=0 );.  if(
f680: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
f690: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
f6a0: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
f6b0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
f6c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f6d0: 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72  arse);.    asser
f6e0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( v!=0 );.    i
f6f0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
f700: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
f710: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
f720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f730: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f740: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
f750: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f760: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f770: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
f780: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
f790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f7a0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
f7b0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f7c0: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
f7d0: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
f7e0: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
f7f0: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
f800: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
f810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f820: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f830: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
f840: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f860: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
f870: 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
f880: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f890: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f8a0: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f8b0: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
f8c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f8d0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
f8e0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
f8f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f900: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
f910: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
f920: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
f930: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
f940: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
f950: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
f960: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
f970: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
f980: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
f990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f9a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f9b0: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
f9c0: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
f9d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f9e0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
f9f0: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
fa00: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
fa10: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fa20: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
fa30: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
fa40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa50: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
fa60: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fa70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fa80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa90: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
faa0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
fab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fac0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fad0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fae0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
faf0: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
fb00: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
fb10: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
fb20: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
fb30: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
fb40: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
fb50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
fb60: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
fb70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
fb80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fba0: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
fbb0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
fbc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fbd0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
fbe0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
fbf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fc00: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
fc10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
fc20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
fc30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
fc40: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
fc50: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
fc60: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
fc70: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
fc80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
fc90: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
fca0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
fcb0: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
fcc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fcd0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
fce0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fcf0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
fd00: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
fd10: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
fd20: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
fd30: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
fd40: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
fd50: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
fd60: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
fd70: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fd80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fd90: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
fda0: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
fdb0: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
fdc0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
fdd0: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
fde0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fdf0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
fe00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
fe10: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
fe20: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
fe30: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
fe40: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
fe50: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
fe60: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
fe70: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
fe80: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
fe90: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
fea0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
feb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
fec0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
fed0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
fee0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
fef0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
ff00: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
ff10: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
ff20: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
ff30: 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
ff40: 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
ff50: 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
ff60: 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
ff70: 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
ff80: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
ff90: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
ffa0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
ffb0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
ffc0: 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
ffd0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
ffe0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
fff0: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
10000 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
10010 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
10020 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
10030 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
10040 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
10050 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
10060 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
10070 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
10080 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
10090 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
100a0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
100b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
100c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
100d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
100e0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
100f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
10100 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
10110 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
10120 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
10130 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
10140 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
10150 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
10160 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
10170 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
10180 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
10190 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
101a0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
101b0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
101c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
101d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
101e0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
101f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10200 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10210 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
10220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10230 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
10240 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
10250 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
10260 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
10270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
10280 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
10290 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
102a0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
102b0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
102c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
102d0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
102e0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
102f0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
10300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10310 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
10320 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
10330 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
10340 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
10350 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
10360 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
10370 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
10380 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
10390 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
103a0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
103b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
103c0 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
103d0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
103e0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
103f0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
10400 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
10410 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
10420 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
10430 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
10440 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
10450 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
10460 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
10470 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
104a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
104b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
104e0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
104f0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
10500 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
10510 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
10520 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
10530 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
10540 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
10550 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
10560 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
10570 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
10580 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  ].isRecursive fl
10590 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
105a0 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
105b0 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
105c0 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
105d0 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
105e0 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
105f0 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
10600 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
10610 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
10620 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
10630 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
10640 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
10650 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
10660 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
10670 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
10680 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
10690 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
106a0 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
106b0 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
106c0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
106d0 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
106e0 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
106f0 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
10700 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
10710 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
10720 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10730 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
10740 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
10750 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
10760 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
10770 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
10780 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10790 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
107a0 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
107b0 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
107c0 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
107d0 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
107e0 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
107f0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
10800 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
10810 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
10820 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
10830 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
10840 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
10850 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
10860 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
10870 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
10880 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
10890 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
108a0 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
108b0 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
108c0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
108d0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
108e0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
108f0 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
10900 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
10910 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
10920 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
10930 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
10940 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
10950 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
10960 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
10970 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
10980 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
10990 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
109a0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
109b0 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
109c0 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
109d0 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
109e0 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
109f0 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
10a00 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
10a10 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
10a20 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
10a30 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
10a40 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
10a50 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
10a60 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
10a70 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
10a80 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
10a90 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
10aa0 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
10ab0 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
10ac0 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
10ad0 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
10ae0 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
10af0 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
10b00 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
10b10 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
10b20 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
10b30 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
10b40 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
10b50 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
10b60 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
10b70 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10b80 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10b90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10bb0 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
10bc0 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
10bd0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
10be0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
10bf0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
10c00 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10c10 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10c20 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
10c30 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
10c40 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
10c50 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10c60 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
10c70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
10c80 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10c90 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
10ca0 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
10cb0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10cc0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
10cd0 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
10ce0 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
10cf0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
10d00 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
10d10 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
10d20 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
10d30 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
10d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d50 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
10d60 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
10d70 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
10d80 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
10d90 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
10da0 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
10db0 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10dd0 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
10de0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
10df0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
10e00 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10e10 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
10e20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10e30 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
10e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10e50 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10e60 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
10e70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
10e80 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
10e90 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
10ea0 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
10eb0 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
10ec0 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
10ed0 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
10ee0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10ef0 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
10f00 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
10f10 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
10f20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10f30 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10f60 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
10f90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10fa0 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
10fb0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
10fc0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10fd0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
10fe0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
10ff0 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
11000 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
11010 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
11020 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
11030 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
11040 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11050 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
11060 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
11070 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
11080 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
11090 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
110a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
110b0 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
110c0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
110d0 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
110e0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
110f0 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
11100 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
11110 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
11120 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11130 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
11140 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
11150 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
11160 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
11170 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
11180 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
11190 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
111a0 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
111b0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
111c0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
111d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
111e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
111f0 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
11200 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11210 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
11220 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
11230 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
11240 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11250 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
11260 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
11270 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
11280 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73  c->a[i].isRecurs
11290 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
112a0 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
112b0 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
112c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
112d0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
112e0 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
112f0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
11300 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
11310 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
11320 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
11330 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
11340 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
11350 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
11360 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
11370 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
11380 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
11390 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
113a0 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
113b0 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
113c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
113d0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
113e0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
113f0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
11400 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
11410 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
11420 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
11430 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
11440 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
11450 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
11460 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
11470 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11480 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
11490 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
114a0 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
114b0 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
114c0 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
114d0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
114e0 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
114f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11510 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
11520 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
11530 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
11540 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
11550 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
11560 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
11570 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
11580 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
11590 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
115a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
115b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
115c0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
115d0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115f0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
11600 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11610 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
11620 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
11630 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
11640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11650 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11660 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
11670 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
11680 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11690 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
116a0 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
116b0 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
116c0 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
116d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
116e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
116f0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
11700 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
11710 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
11720 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
11730 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
11740 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
11750 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
11760 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
11770 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11780 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11790 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
117a0 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
117b0 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
117c0 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
117d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
117e0 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
117f0 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
11800 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
11810 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
11820 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
11830 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
11840 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
11850 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
11860 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
11870 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
11880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11890 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
118a0 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
118b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
118c0 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
118d0 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
118e0 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
118f0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
11900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11910 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
11920 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
11930 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
11940 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
11950 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
11960 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11970 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
11980 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11990 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
119a0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
119b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119c0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
119d0 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
119e0 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
119f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11a00 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
11a10 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
11a20 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
11a30 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
11a40 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
11a50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11a60 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
11a70 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
11a80 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
11a90 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
11aa0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
11ab0 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
11ac0 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
11ad0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
11ae0 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
11af0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
11b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11b10 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67  , OP_IfZero, reg
11b20 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
11b30 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  , -1);.    VdbeC
11b40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
11b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11b60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11b70 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
11b80 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
11b90 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
11ba0 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
11bb0 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
11bc0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
11bd0 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
11be0 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
11bf0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
11c00 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d  Queue..  */.  p-
11c10 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
11c20 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11c30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
11c40 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ue);.  assert( p
11c50 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
11c60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11c70 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  tup;..  /* Keep 
11c80 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
11c90 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11ca0 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
11cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11cc0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11cd0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
11ce0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11cf0 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
11d00 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
11d10 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
11d20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11d30 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11d40 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
11d50 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
11d60 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
11d70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11d80 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
11d90 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
11da0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11db0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
11dc0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
11dd0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
11de0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
11df0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
11e00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11e10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11e20 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11e30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11e40 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
11e50 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
11e60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11e70 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11e80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11e90 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11ea0 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.);.../*.**
11eb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11ec0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
11ed0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
11ee0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
11ef0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
11f00 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
11f10 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
11f20 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
11f30 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
11f40 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
11f50 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
11f60 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
11f70 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
11f80 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
11f90 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
11fa0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
11fb0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
11fc0 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
11fd0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
11fe0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
11ff0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
12000 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
12010 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12020 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
12030 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
12040 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
12050 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
12060 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
12070 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
12080 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
12090 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
120a0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
120b0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
120c0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
120d0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
120e0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
120f0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
12100 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
12110 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
12120 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
12130 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
12140 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
12150 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
12160 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
12170 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
12180 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
12190 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
121a0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
121b0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
121c0 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
121d0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
121e0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
121f0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
12200 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
12210 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12220 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
12230 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
12240 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
12250 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
12260 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
12270 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
12280 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12290 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
122a0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
122b0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
122c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
122d0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
122e0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
122f0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
12300 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
12310 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12320 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
12330 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12340 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12350 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12370 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12380 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12390 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
123a0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
123b0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
123c0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
123d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
123e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
123f0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
12400 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
12410 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
12420 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
12430 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
12440 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
12450 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
12460 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12470 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12480 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
12490 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
124a0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
124b0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
124c0 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
124d0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
124e0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
124f0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
12500 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
12510 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
12520 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12530 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
12540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12550 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
12560 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
12570 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12580 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12590 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
125a0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
125b0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
125c0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
125d0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
125e0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
125f0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
12600 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12610 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
12620 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
12630 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
12640 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
12650 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
12660 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
12670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
12680 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12690 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
126a0 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
126b0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
126c0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
126d0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
126e0 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
126f0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
12700 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
12710 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12720 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12730 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
12740 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
12750 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
12760 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12770 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
12780 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
12790 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
127a0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
127b0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
127c0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
127d0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
127e0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
127f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
12800 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
12810 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12820 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
12830 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
12840 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
12850 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
12860 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
12870 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12880 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12890 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
128a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
128b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
128c0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
128d0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
128e0 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
128f0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
12900 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
12910 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
12920 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
12930 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
12940 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
12950 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
12960 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
12970 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12990 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
129a0 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
129b0 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
129c0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
129d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
129e0 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
129f0 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
12a00 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
12a10 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
12a20 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
12a30 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
12a40 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
12a50 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
12a60 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
12a70 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
12a80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12a90 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
12aa0 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
12ab0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
12ac0 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
12ad0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12ae0 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
12af0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
12b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12b10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12b20 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
12b30 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
12b40 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
12b50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12b60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12b70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
12b80 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
12b90 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
12ba0 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e  ".        " do n
12bb0 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12bc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
12bd0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
12be0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
12bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12c00 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
12c10 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12c20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12c30 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
12c40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12c50 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
12c60 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
12c70 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
12c80 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
12c90 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
12ca0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
12cb0 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
12cc0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
12cd0 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
12ce0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
12cf0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
12d00 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
12d10 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
12d20 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
12d30 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
12d40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12d50 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
12d60 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
12d70 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
12d80 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
12d90 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12da0 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
12db0 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
12dc0 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
12dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
12de0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
12df0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
12e00 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12e10 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12e20 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
12e30 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
12e40 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
12e50 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
12e60 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
12e70 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
12e80 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
12e90 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
12ea0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
12eb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12ec0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12ed0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
12ee0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
12ef0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
12f00 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12f10 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
12f20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
12f30 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12f40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12f50 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
12f60 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
12f70 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
12f80 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
12f90 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
12fa0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
12fb0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
12fc0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12fd0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
12fe0 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
12ff0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13000 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
13010 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
13020 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
13030 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
13040 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
13050 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13060 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
13070 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13090 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
130a0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
130b0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
130c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
130d0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
130e0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
130f0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
13100 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
13110 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
13120 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
13130 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
13140 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
13150 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
13160 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
13170 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
13180 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
13190 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
131a0 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
131b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
131c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
131d0 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
131e0 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
131f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13200 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13210 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
13220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
13240 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
13250 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
13260 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
13270 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
13280 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
13290 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
132a0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
132b0 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
132c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
132d0 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
132e0 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
132f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
13300 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
13310 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
13320 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
13330 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
13340 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
13350 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
13360 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
13370 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
13380 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
13390 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
133a0 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
133b0 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
133c0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
133d0 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
133e0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
133f0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13400 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
13410 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
13420 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
13430 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
13440 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
13450 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
13460 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
13470 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
13480 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
13490 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
134a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
134b0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
134c0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
134d0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
134e0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
134f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13500 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
13510 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
13520 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
13530 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
13540 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
13550 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
13560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
13570 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
13580 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
13590 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
135a0 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
135b0 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
135c0 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
135d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
135e0 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
135f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
13600 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13610 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13620 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13640 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13650 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
13660 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13670 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13680 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
13690 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
136a0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
136b0 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
136c0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
136d0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
136e0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
136f0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13700 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13710 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
13720 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
13730 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
13740 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13750 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
13760 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
13770 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13780 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
13790 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
137a0 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
137b0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
137c0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
137d0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
137e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
137f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
13800 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
13810 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
13820 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
13830 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13840 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13850 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
13860 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
13870 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
13880 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13890 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
138a0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
138b0 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
138c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
138d0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
138e0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
138f0 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
13900 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
13910 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
13920 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
13930 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
13940 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
13950 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
13960 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
13970 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
13980 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
13990 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
139a0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
139b0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
139c0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
139d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
139e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
139f0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
13a00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13a20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
13a30 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
13a40 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
13a50 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
13a60 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
13a70 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
13a80 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
13a90 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
13aa0 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
13ab0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
13ac0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13ad0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
13ae0 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13af0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13b00 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13b10 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13b20 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
13b30 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
13b40 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
13b50 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
13b60 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
13b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13b80 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13b90 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
13ba0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
13bb0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
13bc0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
13bd0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
13be0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
13bf0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
13c00 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
13c10 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
13c20 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
13c30 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
13c40 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
13c50 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
13c60 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
13c70 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
13c80 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
13c90 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
13ca0 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
13cb0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
13cc0 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
13cd0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13ce0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13cf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13d00 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13d10 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
13d20 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
13d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
13d40 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
13d50 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
13d60 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
13d70 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
13d80 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
13d90 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
13da0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
13db0 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
13dc0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
13dd0 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
13de0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13df0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13e00 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
13e10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13e20 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
13e30 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13e40 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
13e50 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
13e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13e70 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
13e80 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
13e90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13ea0 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
13eb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13ec0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13ed0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
13ee0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
13ef0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
13f00 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13f20 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13f30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13f50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
13f60 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
13f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13f80 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
13f90 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
13fa0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13fc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13fd0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
13fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
14000 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
14010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14020 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14030 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
14040 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
14050 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
14060 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
14070 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
14080 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
14090 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
140a0 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
140b0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
140c0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
140d0 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
140e0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
140f0 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
14100 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
14110 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
14120 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
14130 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
14140 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
14150 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
14160 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
14170 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
14180 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
14190 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
141a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
141b0 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
141c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
141d0 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
141e0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
141f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
14200 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
14210 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14220 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14230 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
14240 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14250 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14260 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
14270 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14280 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14290 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
142a0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
142b0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
142c0 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
142d0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
142e0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
142f0 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
14300 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
14310 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
14320 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
14330 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
14340 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
14350 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
14360 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
14370 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14380 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14390 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
143a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
143b0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
143c0 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
143d0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
143e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
143f0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14400 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
14410 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
14420 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
14430 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
14440 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
14450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14460 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14470 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14480 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
14490 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
144a0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
144b0 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
144c0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
144d0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
144e0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
144f0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14500 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14510 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14520 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
14530 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
14540 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14550 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14560 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
14570 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
14580 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14590 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
145a0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
145b0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
145c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
145d0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
145e0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
145f0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14600 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14610 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14620 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
14630 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
14640 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
14650 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
14660 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
14670 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
14680 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
146a0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
146b0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
146c0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
146d0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
146e0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
146f0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
14700 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
14710 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
14720 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
14730 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
14740 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
14750 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14760 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
14770 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14780 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14790 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
147a0 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
147b0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
147c0 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
147d0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
147e0 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
147f0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
14800 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
14810 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
14820 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
14830 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14840 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14850 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
14860 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14870 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
14880 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14890 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
148a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
148b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
148c0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
148d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
148e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
148f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14900 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14910 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
14920 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14930 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
14940 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
14950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
14960 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
14970 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
14980 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
14990 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
149a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
149b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
149c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
149d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
149e0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
149f0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
14a00 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14a10 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
14a20 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
14a30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14a40 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
14a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14a60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14a70 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
14a80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14a90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14aa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14ab0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
14ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
14ae0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
14af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b00 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14b10 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
14b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14b30 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
14b40 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
14b50 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
14b60 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
14b70 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
14b80 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14b90 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
14ba0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
14bb0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
14bc0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
14bd0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
14be0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
14bf0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
14c00 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
14c10 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
14c20 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
14c30 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
14c40 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14c50 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
14c60 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
14c70 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
14c80 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
14c90 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
14ca0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
14cb0 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
14cc0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
14cd0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
14ce0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
14cf0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
14d00 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
14d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14d20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
14d30 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
14d40 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14d70 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
14d80 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
14d90 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14da0 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
14db0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
14dc0 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
14dd0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
14de0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
14df0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
14e00 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
14e10 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
14e20 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
14e30 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
14e40 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
14e50 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
14e60 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
14e90 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
14ea0 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
14eb0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
14ec0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
14ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
14ee0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
14ef0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
14f00 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
14f10 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
14f20 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
14f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14f40 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14f50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
14f60 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
14f70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
14f80 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
14f90 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
14fa0 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
14fb0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
14fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
14fd0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
14fe0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
14ff0 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
15000 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
15010 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
15020 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
15030 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
15040 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
15050 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
15060 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
15070 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
15080 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
15090 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
150a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
150b0 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
150c0 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
150d0 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
150e0 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
150f0 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
15100 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
15110 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
15120 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
15130 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15140 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
15150 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
15160 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15180 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15190 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
151a0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
151b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
151c0 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
151d0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
151e0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
15210 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
15220 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
15230 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
15240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
15250 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
15260 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
15270 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
15280 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
15290 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
152a0 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
152b0 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
152c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
152d0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
152e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
152f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15300 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
15310 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
15320 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
15330 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
15340 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
15350 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
15360 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
15370 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
15380 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
15390 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
153a0 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
153b0 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
153c0 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
153d0 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
153e0 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
153f0 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
15400 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
15410 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
15420 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
15430 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
15440 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
15450 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
15460 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
15470 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
15480 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15490 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
154a0 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
154b0 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
154c0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
154d0 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
154e0 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
154f0 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
15500 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15510 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
15520 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
15530 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
15540 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
15550 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
15560 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
15570 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
15580 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
15590 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
155a0 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
155b0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
155c0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
155d0 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
155e0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
155f0 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
15600 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
15610 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15620 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15640 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
15650 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
15660 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
15670 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
15680 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
15690 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
156a0 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
156b0 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
156c0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
156d0 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
156e0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
156f0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
15700 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
15710 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
15720 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
15730 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
15740 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
15750 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
15760 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
15770 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
15780 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
15790 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
157a0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
157b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
157c0 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
157d0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
157e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
157f0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
15800 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
15810 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15820 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15830 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
15840 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15850 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
15860 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
15870 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
15880 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
15890 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
158a0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
158b0 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
158c0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
158d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
158e0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
158f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15900 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15910 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15920 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
15930 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
15940 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
15970 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
15980 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
15990 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
159a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
159b0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
159c0 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
159d0 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
159e0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
159f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15a00 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
15a10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15a20 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
15a30 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
15a40 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
15a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15a70 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
15a80 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
15a90 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15aa0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
15ab0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
15ac0 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
15ad0 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
15ae0 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
15af0 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
15b00 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
15b10 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
15b20 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
15b30 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
15b40 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
15b50 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
15b60 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
15b70 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15b80 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
15b90 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
15ba0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
15bb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15bc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15bd0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
15be0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15bf0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
15c00 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
15c10 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
15c20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15c30 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
15c40 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
15c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15c60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
15c70 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
15c80 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
15c90 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
15ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15cb0 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
15cc0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
15cd0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
15ce0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15cf0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
15d00 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
15d10 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15d20 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
15d30 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
15d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15d50 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15d60 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
15d70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15d80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15d90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15da0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
15db0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15dc0 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
15dd0 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
15de0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
15df0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
15e00 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
15e10 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
15e20 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
15e30 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
15e40 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
15e50 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
15e60 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
15e70 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
15e80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15e90 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
15ea0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
15eb0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
15ec0 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  st==1 );.      p
15ed0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
15ee0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15ef0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
15f00 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
15f10 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
15f20 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
15f30 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15f40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15f50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
15f70 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
15f80 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
15f90 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
15fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15fb0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15fc0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
15fd0 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
15fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ff0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
16000 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
16010 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
16020 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16030 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16040 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
16050 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
16060 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
16070 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
16080 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
16090 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
160a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
160b0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
160c0 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
160d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
160e0 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
160f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16100 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16110 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44  r, 1, pDest->iSD
16120 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
16130 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
16140 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
16150 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
16160 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
16170 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
16180 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16190 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
161a0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
161b0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
161c0 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
161d0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
161e0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
161f0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16200 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16210 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16220 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16230 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16240 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16250 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
16260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16270 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
16280 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16290 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
162a0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
162b0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
162c0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
162d0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
162e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
162f0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
16300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16310 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
16320 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
16330 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
16340 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
16350 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
16360 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
16370 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
16380 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
16390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
163a0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
163b0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
163c0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
163d0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
163e0 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
163f0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
16400 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
16410 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
16420 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
16430 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16450 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16460 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16470 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53  iSdst, pDest->nS
16480 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
16490 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
164a0 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
164b0 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
164c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
164d0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
164e0 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
164f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
16500 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
16510 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
16520 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
16530 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
16540 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
16550 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
16560 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
16570 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
16580 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
16590 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
165a0 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
165b0 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
165c0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
165d0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
165e0 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
165f0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
16600 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
16610 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
16620 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
16630 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
16640 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
16650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
16660 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
16670 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16680 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
16690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
166a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
166b0 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
166c0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
166d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
166e0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
166f0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
16700 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
16710 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
16720 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16730 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
16740 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
16750 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
16760 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
16770 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16790 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
167a0 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
167b0 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56  , iBreak, -1); V
167c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
167d0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
167e0 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
167f0 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
16800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16810 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
16820 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
16830 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16840 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
16850 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
16860 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
16870 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
16880 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
16890 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
168a0 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
168b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
168c0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
168d0 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
168e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
168f0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
16900 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
16910 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
16920 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
16930 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
16940 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
16950 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
16960 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
16970 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
16980 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
16990 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
169a0 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
169b0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
169c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
169d0 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
169e0 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
169f0 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
16a00 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
16a10 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
16a20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
16a30 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
16a40 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
16a50 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
16a60 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
16a70 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
16a80 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
16a90 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
16aa0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
16ab0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
16ac0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
16ad0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
16ae0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
16af0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
16b00 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
16b10 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
16b20 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
16b30 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
16b40 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
16b50 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
16b60 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
16b70 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
16b80 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
16b90 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
16ba0 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
16bb0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
16bc0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
16bd0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
16be0 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
16bf0 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
16c00 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
16c10 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
16c20 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
16c30 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
16c40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
16c50 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
16c60 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
16c70 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
16c80 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
16c90 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
16ca0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
16cb0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
16cc0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
16cd0 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
16ce0 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
16cf0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
16d00 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
16d10 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
16d20 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
16d30 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
16d40 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
16d50 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
16d60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16d70 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
16d80 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
16d90 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
16da0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
16db0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
16dc0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
16dd0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
16de0 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
16df0 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
16e00 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
16e10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
16e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e30 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16e40 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16e50 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
16e60 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16e70 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16e80 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16e90 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
16ea0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
16eb0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16ec0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
16ed0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
16ee0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
16ef0 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
16f00 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16f10 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
16f20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
16f30 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
16f40 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
16f50 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
16f60 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
16f70 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
16f80 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
16f90 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
16fa0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
16fb0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
16fc0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
16fd0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
16fe0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
16ff0 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
17000 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
17010 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
17020 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
17030 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
17040 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
17050 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
17060 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
17070 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
17080 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
17090 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
170a0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
170b0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
170c0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
170d0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
170e0 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
170f0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
17100 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
17110 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
17120 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
17130 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
17140 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
17150 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
17160 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
17170 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
17180 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
17190 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
171a0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
171b0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
171c0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
171d0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
171e0 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
171f0 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
17200 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
17210 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
17220 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
17230 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
17240 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
17250 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
17260 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
17270 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
17280 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
17290 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
172a0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
172b0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
172c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
172d0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
172e0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
172f0 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
17300 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
17310 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
17320 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
17330 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
17340 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
17350 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
17360 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
17370 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
17380 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
17390 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
173a0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
173b0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
173c0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
173d0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
173e0 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
173f0 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
17400 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17410 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
17420 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
17430 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
17440 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
17450 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
17460 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
17470 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
17480 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
17490 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
174a0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
174b0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
174c0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
174d0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
174e0 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
174f0 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
17500 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
17510 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
17520 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
17530 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
17540 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
17550 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
17560 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
17570 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
17580 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
17590 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
175a0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
175b0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
175c0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
175d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
175e0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
175f0 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
17600 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
17610 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
17620 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17630 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17640 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
17650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17660 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
17670 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
17680 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
17690 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
176a0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
176b0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
176c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
176d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
176e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
176f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
17700 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
17710 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
17720 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
17730 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
17740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17750 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17760 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
17770 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
17780 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
17790 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
177a0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
177b0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
177c0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
177d0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
177e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
177f0 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
17800 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17810 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
17820 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17830 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
17840 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
17850 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
17860 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
17870 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
17880 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
17890 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
178a0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
178b0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
178c0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
178d0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
178e0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
178f0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
17900 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17910 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17920 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
17930 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17940 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
17950 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17960 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
17970 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
17980 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
17990 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
179a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
179b0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
179c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
179d0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
179e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
179f0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
17a00 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17a10 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
17a20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17a30 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
17a40 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
17a50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
17a60 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
17a70 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
17a80 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
17a90 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
17aa0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
17ab0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17ac0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
17ad0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
17ae0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
17af0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
17b00 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17b10 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
17b20 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
17b30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17b40 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
17b50 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17b60 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
17b70 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17b80 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
17b90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17ba0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
17bb0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
17bc0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
17bd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
17be0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
17bf0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
17c00 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
17c10 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
17c20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
17c30 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
17c40 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
17c50 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
17c60 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
17c70 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17c80 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
17c90 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
17ca0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
17cb0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
17cc0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
17cd0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
17ce0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
17cf0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
17d00 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
17d10 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
17d30 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
17d40 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
17d50 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
17d60 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
17d70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
17d80 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
17d90 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
17da0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
17dc0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
17dd0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
17de0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
17df0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
17e00 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
17e10 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
17e20 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
17e30 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
17e40 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
17e50 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
17e60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
17e70 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
17e80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
17e90 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17ea0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17eb0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17ec0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
17ed0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17ee0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
17ef0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
17f00 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17f10 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
17f20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
17f30 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
17f40 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
17f50 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
17f60 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
17f70 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
17f80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
17f90 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
17fa0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
17fb0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
17fc0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
17fd0 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
17fe0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
17ff0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
18000 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
18010 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
18020 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
18030 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
18040 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
18050 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
18060 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
18070 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
18080 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
18090 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
180a0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
180b0 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
180c0 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
180d0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
180e0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
180f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
18100 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
18110 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
18120 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18130 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
18140 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
18150 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
18160 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
18170 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
18180 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
18190 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
181a0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
181b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
181c0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
181d0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
181e0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
181f0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
18200 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
18210 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
18220 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
18230 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
18240 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
18250 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
18260 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
18270 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
18280 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
18290 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
182a0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
182b0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
182c0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
182d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
182e0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
182f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18300 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
18310 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
18320 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
18330 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
18340 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
18350 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
18360 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18370 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18380 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
18390 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
183a0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
183b0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
183c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
183d0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
183e0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
183f0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
18400 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
18410 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
18420 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
18430 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18440 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
18450 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
18460 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
18470 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
18480 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
18490 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
184a0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
184b0 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
184c0 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
184d0 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
184e0 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
184f0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
18500 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
18510 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
18520 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
18530 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
18540 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
18550 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
18560 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
18570 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
18580 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
18590 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
185a0 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
185b0 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
185c0 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
185d0 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
185e0 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
185f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18600 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
18610 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
18620 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
18630 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
18640 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
18650 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
18660 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
18670 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
18680 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
18690 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
186a0 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
186b0 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
186c0 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
186d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
186e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
186f0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
18700 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
18710 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
18720 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18730 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18740 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20  erByCol>0.      
18750 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e      && pItem->u.
18760 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
18770 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
18780 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
18790 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
187a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
187b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
187c0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
187d0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
187e0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
187f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18800 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
18810 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
18820 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18830 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
18840 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
18850 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
18860 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
18870 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
18880 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
18890 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
188a0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
188b0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
188c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
188d0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
188e0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
188f0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
18900 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
18910 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
18920 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
18930 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
18940 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
18950 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
18960 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
18970 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
18980 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
18990 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
189a0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
189b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
189c0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
189d0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
189e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
189f0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
18a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18a10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18a20 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
18a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a40 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
18a50 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
18a60 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
18a70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
18a80 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
18a90 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
18aa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18ab0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
18ac0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
18ad0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
18ae0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
18af0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
18b00 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
18b10 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
18b20 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
18b30 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
18b40 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
18b50 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18b60 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
18b70 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
18b80 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
18b90 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
18ba0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
18bb0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
18bc0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
18bd0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
18be0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
18bf0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
18c00 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
18c10 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
18c20 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
18c30 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18c40 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18c50 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
18c60 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
18c70 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
18c80 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
18c90 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
18ca0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
18cb0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
18cc0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
18cd0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
18ce0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
18cf0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
18d00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18d10 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
18d20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18d40 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18d50 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
18d60 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
18d70 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
18da0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
18db0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18dc0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
18dd0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
18de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
18df0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
18e00 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
18e10 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
18e20 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
18e30 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18e40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18e50 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
18e60 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
18e70 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
18e80 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
18e90 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
18ea0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
18eb0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
18ec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18ed0 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
18ee0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
18ef0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
18f00 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
18f10 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18f20 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
18f30 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
18f40 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
18f50 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
18f60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
18f70 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
18f80 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
18f90 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
18fa0 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
18fb0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
18fc0 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
18fd0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
18fe0 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
18ff0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19000 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d  r(v) + 1;.  j1 =
19010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19020 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
19030 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
19040 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
19050 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
19060 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
19070 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
19080 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19090 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
190a0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
190b0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
190c0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
190d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
190e0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
190f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19100 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19110 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
19120 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19130 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
19140 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19150 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
19160 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
19170 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
19180 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
19190 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
191a0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
191b0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
191c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
191d0 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69  + 1;.  j1 = sqli
191e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
191f0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19200 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
19210 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
19220 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19230 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
19240 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
19250 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
19260 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
19270 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
19280 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
19290 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
192a0 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
192b0 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
192c0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
192d0 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
192e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
192f0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
19300 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
19310 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
19320 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
19330 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19340 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
19350 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
19360 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
19370 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19380 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
19390 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
193a0 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
193b0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
193c0 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
193d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
193e0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
193f0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19400 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19410 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
19420 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
19430 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
19440 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
19450 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
19460 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
19470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19480 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19490 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
194a0 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
194b0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
194c0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
194d0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
194e0 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
194f0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19500 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19510 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
19520 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19530 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
19540 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
19550 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19560 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
19570 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
19580 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
19590 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
195a0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
195b0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
195c0 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
195d0 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
195e0 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
195f0 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
19600 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19610 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
19620 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
19630 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19640 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
19650 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
19660 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
19670 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
19680 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
19690 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
196a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
196b0 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
196c0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
196d0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
196e0 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
196f0 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
19700 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
19710 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
19720 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
19730 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
19740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19750 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
19760 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
19770 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
19780 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
19790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
197a0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
197b0 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
197e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
197f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19800 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19810 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
19820 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
19830 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
19840 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
19850 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19860 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
19870 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
19880 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
19890 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
198a0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
198b0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
198c0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
198d0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
198e0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
198f0 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
19900 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
19910 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
19920 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
19930 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
19940 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
19950 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
19960 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19970 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
19980 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
19990 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
199a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
199b0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
199c0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
199d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
199e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
199f0 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
19a00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19a10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19a30 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
19a40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19a50 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
19a60 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
19a70 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
19a80 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
19a90 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
19aa0 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
19ab0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19ac0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19ad0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
19ae0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
19af0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19b00 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19b10 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
19b20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
19b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b40 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
19b50 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
19b60 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19b70 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
19b80 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
19b90 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19ba0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
19bb0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
19bc0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
19bd0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19be0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
19bf0 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
19c00 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
19c10 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19c20 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
19c30 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19c40 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
19c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c60 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19c70 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19c80 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
19c90 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19ca0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19cb0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
19cc0 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
19cd0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19ce0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19cf0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
19d00 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19d10 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
19d20 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
19d30 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
19d40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19d50 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
19d60 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
19d70 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
19d80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d90 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
19da0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
19db0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19dc0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19dd0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
19de0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
19df0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
19e00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e10 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19e20 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
19e30 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
19e40 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
19e50 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
19e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19e70 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
19e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19e90 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19ea0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19eb0 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
19ec0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
19ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19ee0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19ef0 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
19f00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19f10 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
19f20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
19f30 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
19f40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19f50 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
19f60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19f70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
19f80 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
19f90 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
19fa0 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
19fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19fc0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
19fd0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
19fe0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
19ff0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1a020 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1a030 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1a040 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1a050 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1a060 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a070 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1a080 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1a090 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1a0a0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1a0b0 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1a0c0 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1a0d0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1a0e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1a0f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a100 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1a110 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
1a120 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1a130 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
1a140 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1a150 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
1a160 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1a170 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
1a180 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
1a190 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
1a1a0 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
1a1b0 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
1a1c0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1a1d0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
1a1e0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1a1f0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1a200 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1a210 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1a220 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1a230 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1a240 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a250 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1a260 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1a270 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1a280 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1a290 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1a2a0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1a2b0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1a2c0 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1a2d0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1a2e0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1a2f0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1a300 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1a310 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
1a320 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
1a330 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
1a340 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
1a350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a360 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
1a370 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a380 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1a390 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1a3a0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1a3b0 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1a3c0 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1a3d0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1a3e0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
1a3f0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
1a400 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
1a410 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1a420 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
1a430 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
1a440 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
1a450 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
1a460 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
1a470 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
1a480 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
1a490 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
1a4a0 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
1a4b0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1a4c0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
1a4d0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
1a4e0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
1a4f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1a500 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
1a510 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
1a520 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a530 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
1a540 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
1a550 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
1a560 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
1a570 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
1a580 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
1a590 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
1a5a0 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
1a5b0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
1a5c0 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
1a5d0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
1a5e0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
1a5f0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
1a600 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
1a610 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
1a620 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1a630 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1a640 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1a650 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1a660 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1a670 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a680 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1a690 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1a6a0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1a6b0 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1a6c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1a6e0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1a6f0 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
1a700 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1a710 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
1a720 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1a730 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1a740 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1a750 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
1a760 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1a770 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1a780 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
1a790 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
1a7a0 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
1a7b0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1a7c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a7d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a7e0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1a7f0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
1a800 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a810 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1a820 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1a830 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
1a840 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
1a850 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
1a860 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
1a870 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
1a880 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1a8a0 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
1a8b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
1a8c0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
1a8d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a8e0 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
1a8f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1a900 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
1a910 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1a920 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1a930 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1a940 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a950 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1a960 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
1a980 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a990 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1a9a0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1a9b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1a9c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a9d0 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
1a9e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a9f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1aa00 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1aa10 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
1aa20 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
1aa30 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1aa40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1aa50 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1aa60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1aa70 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1aa80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa90 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1aaa0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1aab0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1aac0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1aad0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1aae0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1aaf0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1ab00 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1ab10 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1ab20 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1ab30 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1ab40 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1ab50 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1ab60 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1ab70 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1ab80 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1ab90 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1aba0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1abb0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1abc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1abd0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1abe0 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1abf0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1ac00 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1ac10 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1ac20 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1ac30 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ac40 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1ac50 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1ac60 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1ac70 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1ac80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1ac90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1aca0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1acb0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1acc0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1acd0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1ace0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1acf0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1ad00 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1ad10 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1ad20 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1ad30 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1ad40 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1ad50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ad60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1ad70 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1ad80 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ad90 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1ada0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1adb0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1adc0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
1add0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1ade0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1adf0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1ae00 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ae10 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
1ae20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1ae30 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1ae40 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
1ae50 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1ae60 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
1ae70 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
1ae80 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
1ae90 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
1aea0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1aeb0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1aec0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1aed0 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
1aee0 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
1aef0 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
1af00 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
1af10 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
1af20 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
1af30 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1af40 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1af50 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1af60 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1af70 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
1af80 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1af90 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1afa0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1afb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1afc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1afd0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1afe0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1aff0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b000 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b010 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b030 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1b040 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1b050 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1b060 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1b070 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1b080 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1b090 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1b0a0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1b0b0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1b0c0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1b0d0 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1b0e0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1b0f0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1b100 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1b110 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1b120 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1b130 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1b140 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1b150 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1b160 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1b170 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1b180 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1b190 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1b1a0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1b1b0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1b1c0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1b1d0 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1b1e0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1b1f0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1b200 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1b210 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1b220 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1b230 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1b240 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1b250 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1b260 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1b270 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1b280 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1b290 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1b2a0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1b2b0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1b2c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1b2d0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1b2e0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1b2f0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1b300 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1b310 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1b320 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1b330 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1b340 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b350 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1b360 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1b370 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1b380 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1b390 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1b3a0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1b3b0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1b3c0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1b3d0 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1b3e0 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1b3f0 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1b400 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1b410 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1b420 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1b430 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1b440 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1b450 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1b460 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1b470 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1b480 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1b490 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1b4a0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1b4b0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1b4c0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1b4d0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1b4e0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1b4f0 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
1b500 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1b510 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1b520 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1b530 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1b540 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1b550 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1b560 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1b570 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1b580 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1b590 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1b5a0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1b5b0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1b5c0 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1b5d0 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1b5e0 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1b5f0 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1b600 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1b610 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1b620 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1b630 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1b640 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1b650 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1b660 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1b670 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1b680 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1b690 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1b6a0 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1b6b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1b6c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b6d0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1b6e0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1b6f0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1b700 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1b710 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1b720 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1b730 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1b740 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1b750 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1b760 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1b770 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1b780 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1b790 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1b7a0 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1b7b0 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1b7c0 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1b7d0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1b7e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1b7f0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1b800 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1b810 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b820 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1b830 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1b840 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1b850 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1b860 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b870 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1b880 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b890 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b8a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1b8b0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1b8c0 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1b8d0 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1b8e0 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1b8f0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1b900 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1b910 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1b920 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1b930 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1b940 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1b950 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a  .**        text:
1b960 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64   "The subquery d
1b970 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1b980 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1b990 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1b9a0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
1b9b0 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1b9c0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1b9d0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1b9e0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b9f0 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1ba00 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1ba10 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1ba20 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1ba30 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1ba40 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1ba50 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1ba60 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1ba70 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1ba80 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1ba90 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1baa0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1bab0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1bac0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1bad0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1bae0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1baf0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1bb00 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1bb10 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1bb20 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1bb30 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1bb40 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1bb50 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1bb60 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1bb70 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1bb80 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1bb90 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1bba0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1bbb0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1bbc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1bbd0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1bbe0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1bbf0 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1bc00 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1bc10 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1bc20 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1bc30 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1bc40 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1bc50 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1bc60 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1bc70 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1bc80 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1bc90 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1bca0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1bcb0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1bcc0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1bcd0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1bce0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1bcf0 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1bd00 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1bd10 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1bd20 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1bd30 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1bd40 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1bd50 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1bd60 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1bd70 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1bd80 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1bd90 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1bda0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1bdb0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1bdc0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1bdd0 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1bde0 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1bdf0 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1be00 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1be10 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1be20 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1be30 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1be40 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1be50 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1be60 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1be70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1be80 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1be90 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1bea0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1beb0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1bec0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1bed0 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1bee0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1bef0 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1bf00 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1bf10 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1bf20 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1bf30 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1bf40 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1bf50 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1bf60 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1bf70 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1bf80 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1bf90 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1bfa0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1bfb0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1bfc0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1bfd0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1bfe0 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1bff0 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1c000 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1c010 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1c020 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1c030 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1c040 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1c050 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1c060 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1c070 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1c080 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1c090 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1c0a0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1c0b0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1c0c0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1c0d0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1c0e0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1c0f0 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1c100 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1c110 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1c120 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1c130 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1c140 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1c150 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1c160 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1c170 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c180 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c190 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c1a0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1c1b0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1c1c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1c1d0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1c1e0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1c1f0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1c200 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1c210 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1c220 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1c230 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1c240 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1c250 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1c260 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1c270 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1c280 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1c290 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1c2a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1c2b0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1c2c0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1c2d0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1c2e0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1c2f0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1c300 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1c310 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1c320 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1c330 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1c340 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c350 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c360 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c370 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1c380 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1c390 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1c3a0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1c3b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1c3c0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1c3d0 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1c3e0 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1c3f0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1c400 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1c410 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1c420 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1c430 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1c440 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1c450 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1c460 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1c470 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1c480 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1c490 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1c4a0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1c4b0 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1c4c0 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1c4d0 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
1c4e0 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75   (24)  The subqu
1c4f0 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1c500 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
1c510 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
1c520 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
1c530 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
1c540 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
1c550 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1c560 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
1c570 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
1c580 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
1c590 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
1c5a0 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
1c5b0 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
1c5c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
1c5d0 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
1c5e0 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
1c5f0 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  .).**.**.** In t
1c600 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1c610 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1c620 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1c630 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1c640 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1c650 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1c660 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1c670 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1c680 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1c690 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1c6a0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1c6b0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1c6c0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1c6d0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1c6e0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1c6f0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1c700 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c710 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1c720 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1c730 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1c740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1c750 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1c760 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1c770 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1c780 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1c790 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c7a0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1c7b0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1c7c0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1c7d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1c7e0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1c7f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c800 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1c810 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1c820 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1c830 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1c840 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1c850 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1c860 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1c870 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1c880 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1c890 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1c8a0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1c8b0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1c8c0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1c8d0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1c8e0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1c8f0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1c900 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1c910 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1c920 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1c930 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1c940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1c950 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1c960 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1c970 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1c980 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
1c990 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1c9a0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1c9b0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1c9c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1c9d0 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1c9e0 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1c9f0 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1ca00 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1ca10 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1ca20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1ca30 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1ca40 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1ca50 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1ca60 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1ca70 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1ca80 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
1ca90 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
1caa0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
1cab0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1cac0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
1cad0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
1cae0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1caf0 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
1cb00 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
1cb10 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1cb40 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1cb70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1cb80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1cb90 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1cba0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1cbb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cbc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1cbd0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1cbe0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1cbf0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1cc00 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1cc10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1cc20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1cc30 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1cc40 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1cc50 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1cc60 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1cc70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1cc80 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1cc90 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1cca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1ccb0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1ccc0 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1ccd0 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1cce0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1ccf0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1cd00 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1cd10 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1cd20 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1cd30 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1cd40 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1cd50 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1cd60 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
1cd70 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
1cd80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1cd90 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cda0 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
1cdb0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1cdc0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
1cdd0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cde0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cdf0 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
1ce00 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1ce10 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1ce20 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1ce30 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1ce40 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1ce50 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1ce60 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1ce70 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1ce80 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1ce90 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1cea0 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1ceb0 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1cec0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1ced0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1cee0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1cef0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1cf00 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1cf10 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1cf20 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1cf30 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1cf40 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1cf50 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1cf60 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1cf70 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cf80 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1cf90 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cfb0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1cfc0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cfd0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1cfe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d000 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1d010 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1d020 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1d030 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1d040 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1d050 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d090 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1d0a0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1d0b0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1d0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d0d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d0e0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1d0f0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1d100 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1d110 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1d120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d130 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1d140 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1d150 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1d160 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1d170 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d180 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d190 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1d1a0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1d1b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1d1c0 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1d1d0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d1e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d1f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d200 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1d210 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1d220 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1d230 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1d240 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d280 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1d290 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1d2a0 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1d2b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1d2c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d2d0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1d2e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1d2f0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1d300 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d310 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d320 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1d330 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1d340 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1d350 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1d360 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1d370 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1d380 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1d390 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1d3a0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1d3b0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1d3c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1d3d0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1d3e0 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1d3f0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1d400 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1d410 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1d420 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d430 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1d440 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1d450 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1d460 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d470 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1d480 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1d490 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1d4a0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1d4b0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1d4c0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1d4d0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1d4e0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1d4f0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1d500 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1d510 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1d520 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1d530 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d540 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1d550 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1d560 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1d570 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1d580 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1d590 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d5a0 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1d5b0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1d5c0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1d5d0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1d5e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1d5f0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1d600 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1d610 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1d620 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1d630 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1d640 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1d650 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1d660 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1d670 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d680 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1d690 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1d6a0 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1d6b0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d6c0 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1d6d0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1d6e0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1d6f0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1d700 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1d710 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1d720 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d730 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1d740 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1d750 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1d760 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1d770 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1d780 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1d790 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1d7a0 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1d7b0 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1d7c0 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1d7d0 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1d7e0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1d7f0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1d800 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1d810 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1d820 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1d830 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1d840 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1d850 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1d860 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1d870 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1d880 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1d890 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1d8a0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1d8b0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1d8c0 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1d8d0 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1d8e0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1d8f0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1d900 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1d910 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1d920 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1d930 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1d940 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1d950 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
1d960 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1d970 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1d980 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1d990 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1d9a0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1d9b0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1d9c0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1d9d0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1d9e0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1d9f0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1da00 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1da10 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1da20 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1da30 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1da40 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1da50 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1da60 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1da70 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1da80 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1da90 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1daa0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1dab0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1dac0 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1dad0 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1dae0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1daf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1db00 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1db10 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1db20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1db30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1db40 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1db50 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1db60 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1db70 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1db80 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1db90 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1dba0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1dbb0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1dbc0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1dbd0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1dbe0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1dbf0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1dc00 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1dc10 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1dc20 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1dc30 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1dc40 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1dc50 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1dc60 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
1dc70 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1dc80 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1dc90 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
1dca0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1dcb0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
1dcc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1dcd0 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1dce0 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
1dcf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1dd00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1dd10 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1dd20 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1dd30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1dd40 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1dd50 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1dd60 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1dd70 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1dd80 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1dd90 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1dda0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ddb0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1ddc0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1ddd0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1dde0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ddf0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1de00 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1de10 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1de20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1de30 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41  ***/.  SELECTTRA
1de40 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
1de50 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72  flatten %s.%p fr
1de60 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20  om term %d\n",. 
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65    pSub->zSelName
1de90 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
1dea0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1deb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1dec0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1ded0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1dee0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1def0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1df00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1df10 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1df20 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1df30 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1df40 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1df50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1df60 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1df70 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1df80 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1df90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1dfa0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1dfb0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1dfc0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1dfd0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1dfe0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1dff0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1e000 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1e010 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1e020 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1e030 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1e040 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1e050 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1e060 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1e070 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1e080 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1e090 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1e0a0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1e0b0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1e0c0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1e0d0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1e0e0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1e0f0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1e100 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1e110 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1e120 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1e130 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1e140 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1e150 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1e160 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1e170 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1e180 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1e190 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1e1a0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1e1b0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1e1c0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1e1d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1e1e0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1e1f0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1e200 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1e210 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1e220 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1e230 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1e240 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1e250 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1e260 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1e270 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1e280 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1e290 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1e2a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1e2b0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1e2c0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1e2d0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1e2e0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1e2f0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1e300 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1e310 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1e320 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1e330 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1e340 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1e350 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1e360 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1e370 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1e380 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1e390 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1e3a0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1e3b0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1e3c0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1e3d0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1e3e0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1e3f0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1e400 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1e410 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1e420 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e430 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1e440 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1e450 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1e460 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1e470 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1e480 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1e490 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1e4a0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1e4b0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1e4c0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1e4d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1e4e0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1e4f0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e500 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1e510 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , p, 0);.    sql
1e520 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
1e530 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53  e(pNew, pSub->zS
1e540 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  elName);.    p->
1e550 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1e560 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1e570 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1e580 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1e590 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1e5a0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1e5b0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1e5c0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e5d0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1e5e0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1e5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1e600 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1e610 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1e620 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1e630 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1e640 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1e650 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1e660 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1e670 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c    SELECTTRACE(2,
1e680 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
1e690 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75     ("compound-su
1e6a0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
1e6b0 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61   creates %s.%p a
1e6c0 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20  s peer\n",.     
1e6d0 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61      pNew->zSelNa
1e6e0 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
1e6f0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1e700 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e710 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1e720 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1e730 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1e740 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1e750 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1e760 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e770 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1e780 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1e790 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1e7a0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1e7b0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1e7c0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1e7d0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1e7e0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1e7f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e800 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1e810 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1e820 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e830 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1e840 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e850 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1e860 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1e870 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1e880 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1e890 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e8a0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1e8b0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1e8c0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1e8d0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1e8e0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1e8f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e900 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1e910 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1e920 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1e930 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1e940 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1e950 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1e960 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1e970 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1e980 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1e990 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1e9a0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1e9b0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1e9c0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1e9d0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1e9e0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1e9f0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1ea00 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1ea10 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1ea20 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1ea30 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1ea40 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1ea50 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1ea60 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1ea70 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1ea80 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1ea90 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1eaa0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1eab0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1eac0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1ead0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1eae0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1eaf0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1eb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb10 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1eb20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1eb30 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1eb40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1eb50 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1eb60 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1eb70 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1eb80 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1eb90 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1eba0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1ebb0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1ebc0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1ebd0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1ebe0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1ebf0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1ec00 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1ec10 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1ec20 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1ec30 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1ec40 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1ec50 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1ec60 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1ec70 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1ec80 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1ec90 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1eca0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ecb0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1ecc0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1ecd0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1ece0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1ecf0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1ed00 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1ed10 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1ed20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1ed30 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1ed40 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1ed50 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1ed60 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1ed70 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1ed80 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1ed90 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1eda0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1edb0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1edc0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1edd0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1ede0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1edf0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1ee00 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1ee10 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1ee20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1ee30 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1ee40 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1ee50 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ee60 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1ee70 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1ee80 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1ee90 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1eea0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1eeb0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1eec0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1eed0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1eee0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1eef0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1ef00 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1ef10 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1ef20 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1ef30 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1ef40 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ef50 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1ef60 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1ef70 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1ef80 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1ef90 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1efa0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1efb0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1efc0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1efd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1efe0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1eff0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1f000 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1f010 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1f020 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1f030 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1f040 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f050 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1f060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1f070 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1f080 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1f090 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1f0a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f0b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f0c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1f0d0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1f0e0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f0f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f100 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1f110 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f120 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1f130 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1f140 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1f150 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1f160 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f170 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1f180 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1f190 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1f1a0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1f1b0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1f1c0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1f1d0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1f1e0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1f1f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1f200 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1f210 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f220 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1f230 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1f240 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1f250 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1f260 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1f270 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1f280 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1f290 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1f2a0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1f2b0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1f2c0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1f2d0 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1f2e0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1f2f0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1f300 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1f310 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1f320 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1f330 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1f340 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1f350 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f360 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1f370 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1f380 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1f390 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1f3a0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1f3b0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1f3c0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1f3d0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1f3e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f3f0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1f400 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f410 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1f420 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1f430 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1f440 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1f450 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1f460 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1f470 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1f480 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1f490 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1f4a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1f4b0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1f4c0 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1f4d0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1f4e0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1f4f0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1f500 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1f510 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1f520 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1f530 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1f540 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1f550 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1f560 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1f570 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1f580 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1f590 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1f5a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1f5b0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1f5c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f5d0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1f5e0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f5f0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1f600 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1f610 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1f620 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1f630 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1f640 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1f650 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1f660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1f670 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1f680 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1f690 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1f6a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1f6b0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1f6c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f6d0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1f6e0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1f6f0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1f700 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1f710 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1f720 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1f730 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1f740 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1f750 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1f760 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1f770 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1f780 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1f790 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1f7a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f7b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1f7c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1f7d0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1f7e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1f7f0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1f800 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1f810 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1f820 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f830 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1f840 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1f850 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1f860 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1f870 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1f880 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1f890 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1f8a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f8b0 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1f8c0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1f8d0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1f8e0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1f8f0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f900 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f910 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1f920 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1f930 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1f940 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f950 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f960 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1f970 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
1f980 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
1f990 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
1f9a0 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
1f9b0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f9c0 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
1f9d0 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
1f9e0 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
1f9f0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
1fa00 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
1fa10 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
1fa20 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
1fa30 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
1fa40 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
1fa50 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
1fa60 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
1fa70 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
1fa80 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
1fa90 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
1faa0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
1fab0 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
1fac0 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
1fad0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
1fae0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
1faf0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
1fb00 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
1fb10 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
1fb20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
1fb30 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
1fb40 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1fb50 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
1fb60 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
1fb70 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
1fb80 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
1fb90 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
1fba0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1fbb0 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
1fbc0 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
1fbd0 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
1fbe0 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
1fbf0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
1fc00 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1fc10 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
1fc20 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1fc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
1fc40 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
1fc50 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
1fc60 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
1fc70 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
1fc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fc90 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1fca0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1fcc0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
1fcd0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
1fce0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1fcf0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1fd00 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1fd10 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1fd20 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1fd30 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1fd40 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1fd50 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1fd60 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1fd70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1fd80 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1fd90 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1fda0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1fdb0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1fdc0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1fdd0 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1fde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fdf0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1fe00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fe10 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1fe20 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1fe30 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1fe40 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1fe50 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1fe60 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1fe70 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1fe80 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1fe90 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1fea0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1feb0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1fec0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1fed0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1fee0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1fef0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1ff30 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1ff40 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1ff50 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1ff60 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1ff70 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1ff80 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1ff90 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1ffa0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1ffb0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1ffc0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1ffd0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1ffe0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1fff0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
20000 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
20010 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20020 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20030 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20040 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20050 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20060 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
20070 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
20080 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
20090 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
200a0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
200b0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
200c0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
200d0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
200e0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
200f0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
20100 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
20110 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
20120 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
20130 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
20140 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
20150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
20160 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
20170 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
20180 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20190 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
201a0 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
201b0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
201c0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
201d0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
201e0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
201f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20200 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
20210 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
20220 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
20230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20240 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
20250 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
20260 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
20270 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
20280 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
20290 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
202a0 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
202b0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
202c0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
202d0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
202e0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
202f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20300 74 66 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  tf("After flatte
20310 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73  ning:\n");.    s
20320 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
20330 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
20340 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
20350 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
20360 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
20370 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20380 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
20390 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
203a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
203b0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
203c0 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
203d0 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
203e0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
203f0 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
20400 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
20410 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
20420 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
20430 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
20440 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
20450 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
20460 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
20470 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
20480 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
20490 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
204a0 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
204b0 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
204c0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
204d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
204e0 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
204f0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
20500 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
20510 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
20520 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
20530 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
20540 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
20550 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
20560 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
20570 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
20580 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
20590 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
205a0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
205b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
205c0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
205d0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
205e0 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
205f0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
20600 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
20610 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
20620 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
20630 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
20640 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
20650 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
20660 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
20670 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
20680 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
20690 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
206a0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
206b0 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
206c0 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
206d0 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
206e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
206f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20700 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
20710 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
20720 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
20730 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
20740 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
20750 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
20760 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
20770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
20780 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
20790 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
207a0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
207b0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
207c0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
207d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
207e0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
207f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
20800 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
20810 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
20820 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
20830 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
20840 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
20850 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
20860 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
20870 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
20880 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20890 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
208a0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
208b0 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
208c0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
208d0 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
208e0 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
208f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20900 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
20910 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
20920 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
20930 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
20940 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
20950 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
20960 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
20970 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
20980 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
20990 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
209a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
209b0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
209c0 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
209d0 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
209e0 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
209f0 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
20a00 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
20a10 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
20a20 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
20a30 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
20a40 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
20a50 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
20a60 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
20a70 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
20a80 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
20a90 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
20aa0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20ab0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
20ac0 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
20ad0 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
20ae0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
20af0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
20b00 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
20b10 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
20b20 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
20b30 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
20b40 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
20b50 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
20b60 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
20b70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
20b80 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
20b90 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
20ba0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
20bb0 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
20bc0 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
20bd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20be0 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
20bf0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
20c00 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
20c10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
20c20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
20c30 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
20c40 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
20c50 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
20c60 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
20c70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
20c80 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
20c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
20ca0 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
20cb0 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
20cc0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
20cd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
20ce0 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
20cf0 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
20d00 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
20d10 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
20d20 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
20d30 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
20d40 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
20d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
20d60 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
20d70 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
20d80 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
20d90 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
20da0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
20db0 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
20dc0 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
20dd0 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
20de0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
20df0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
20e00 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
20e10 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
20e20 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
20e30 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
20e40 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
20e50 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
20e60 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
20e70 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
20e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
20e90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
20ea0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
20eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
20ec0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20ed0 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
20ee0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
20ef0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
20f00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
20f10 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
20f20 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
20f30 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
20f40 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
20f50 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
20f60 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
20f70 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
20f80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
20f90 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
20fa0 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
20fb0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
20fc0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
20fd0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
20fe0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20ff0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
21000 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
21010 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
21020 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
21030 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
21040 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21050 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
21060 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
21070 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
21080 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
21090 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
210a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
210b0 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
210c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
210d0 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
210e0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
210f0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
21100 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
21110 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
21120 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
21130 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
21140 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
21150 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
21160 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
21170 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
21180 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
21190 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
211a0 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
211b0 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
211c0 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
211d0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
211e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
211f0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
21200 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
21210 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
21220 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
21230 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
21240 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
21250 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
21260 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
21270 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
21280 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
21290 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
212a0 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
212b0 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
212c0 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
212d0 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
212e0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
212f0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
21300 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
21310 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
21320 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
21330 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
21340 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
21350 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
21360 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
21370 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
21380 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
21390 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
213a0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
213b0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
213c0 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
213d0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
213e0 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
213f0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
21400 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
21410 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
21420 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
21430 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
21440 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
21450 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
21460 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
21470 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
21480 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
21490 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
214a0 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
214b0 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
214c0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
214d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
214e0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
214f0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
21500 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
21510 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
21520 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
21530 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
21540 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
21550 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
21560 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21570 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
21580 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
21590 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
215a0 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
215b0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
215c0 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
215d0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
215e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
215f0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
21600 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
21610 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21620 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
21630 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
21640 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
21650 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
21660 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
21670 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
21680 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
21690 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
216a0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
216b0 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
216c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
216d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
216e0 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
216f0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
21700 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
21710 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
21720 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
21730 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
21740 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
21750 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
21760 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
21770 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
21780 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
21790 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
217a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
217b0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
217c0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
217d0 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20  , TK_ALL, 0));. 
217e0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
217f0 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
21800 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
21810 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
21820 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
21830 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
21840 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
21850 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
21860 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  t = 0;.  p->selF
21870 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
21880 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
21890 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
218a0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
218b0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
218c0 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
218d0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
218e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
218f0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21900 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
21910 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
21920 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
21930 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
21940 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
21950 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
21960 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
21970 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
21980 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
21990 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
219a0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
219b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
219c0 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
219d0 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
219e0 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
219f0 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
21a00 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21a10 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
21a20 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
21a30 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
21a40 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
21a50 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
21a60 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
21a70 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
21a80 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
21a90 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
21aa0 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
21ab0 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
21ac0 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
21ad0 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
21ae0 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
21af0 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
21b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
21b10 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20  rrent outermost 
21b20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
21b30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21b40 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
21b50 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
21b60 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
21b70 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
21b80 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
21b90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
21ba0 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
21bb0 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
21bc0 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
21bd0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
21be0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
21bf0 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
21c00 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
21c10 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
21c20 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
21c30 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
21c40 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
21c50 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
21c60 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
21c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
21c80 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21c90 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
21ca0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
21cb0 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
21cc0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
21cd0 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
21ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21cf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21d00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
21d10 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
21d20 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
21d30 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
21d40 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
21d50 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
21d60 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
21d70 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
21d80 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
21d90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21da0 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
21db0 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
21dc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21dd0 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
21de0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
21df0 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
21e00 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
21e10 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
21e20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
21e30 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
21e40 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
21e50 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
21e60 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
21e70 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
21e80 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
21e90 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
21ea0 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
21eb0 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
21ec0 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
21ed0 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
21ee0 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
21ef0 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
21f00 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
21f10 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
21f20 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
21f30 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
21f40 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
21f50 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
21f60 7c 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  | pParse->pWith=
21f70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  =0 );.  if( pWit
21f80 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
21f90 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
21fa0 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
21fb0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
21fc0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62  h;.    pParse->b
21fd0 46 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65  FreeWith = bFree
21fe0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
21ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
22000 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
22010 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
22020 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
22030 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
22040 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
22050 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
22060 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
22070 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
22080 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
22090 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
220a0 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
220b0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
220c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
220d0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
220e0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
220f0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
22100 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
22110 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
22120 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
22130 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
22140 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
22150 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
22160 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
22170 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
22180 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
22190 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
221a0 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
221b0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
221c0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
221d0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
221e0 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
221f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
22200 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
22210 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
22220 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
22230 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
22240 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
22250 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
22260 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
22270 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
22280 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22290 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
222a0 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
222b0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
222c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
222d0 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
222e0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
222f0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
22300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22310 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
22320 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
22330 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
22340 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
22350 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
22360 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
22390 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
223a0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
223b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
223c0 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
223d0 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
223e0 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
223f0 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
22400 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
22410 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
22420 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
22430 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
22440 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
22450 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
22460 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
22470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
22480 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
22490 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
224a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
224b0 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
224c0 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
224d0 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
224e0 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
224f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
22500 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
22510 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
22520 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  /* If pCte->zErr
22530 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
22540 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
22550 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
22560 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
22570 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
22580 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
22590 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
225a0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
225b0 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
225c0 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e   pCte->zErr is N
225d0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
225e0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
225f0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
22600 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
22610 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
22620 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72     if( pCte->zEr
22630 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
22640 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22650 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70  e, pCte->zErr, p
22660 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
22670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22680 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
22690 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
226a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
226b0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
226c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
226d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
226e0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
226f0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
22700 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22710 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
22720 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
22730 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
22740 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
22750 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
22760 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
22770 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
22780 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
22790 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
227a0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
227b0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
227c0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
227d0 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d  meral;.    pFrom
227e0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
227f0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22800 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
22810 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
22820 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
22830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22840 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
22850 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
22860 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
22870 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
22880 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
22890 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
228a0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
228b0 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
228c0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
228d0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
228e0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
228f0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
22900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
22910 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
22920 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
22930 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
22940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
22950 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
22960 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
22970 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
22980 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
22990 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
229a0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
229b0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
229c0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
229d0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
229e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
229f0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
22a00 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
22a10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
22a20 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
22a30 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
22a40 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
22a50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
22a60 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
22a70 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
22a80 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
22a90 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
22aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22ab0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
22ac0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22ad0 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
22ae0 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
22af0 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
22b00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
22b10 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
22b20 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
22b30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
22b40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
22b50 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
22b60 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
22b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22b80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
22b90 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
22ba0 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
22bb0 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
22bc0 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
22bd0 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
22be0 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63   pCte->zErr = "c
22bf0 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
22c00 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
22c10 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
22c20 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
22c30 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
22c40 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
22c50 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
22c60 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
22c70 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
22c80 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72   pSel);..    for
22c90 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
22ca0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
22cb0 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
22cc0 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
22cd0 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
22ce0 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
22cf0 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
22d00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
22d10 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
22d20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22d30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22d40 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
22d50 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
22d60 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
22d70 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
22d80 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
22d90 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
22da0 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
22db0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
22dc0 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
22dd0 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
22de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22df0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
22e00 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
22e10 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
22e20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
22e30 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
22e40 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
22e50 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
22e60 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
22e70 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
22e80 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
22e90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
22ea0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
22eb0 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
22ec0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
22ed0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
22ee0 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
22ef0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
22f00 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  >zErr = "recursi
22f10 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
22f20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
22f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22f40 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
22f50 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
22f60 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
22f70 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  >zErr = 0;.    p
22f80 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22f90 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
22fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22fb0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
22fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22fd0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
22fe0 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
22ff0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23000 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
23010 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
23020 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
23030 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
23040 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
23050 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
23060 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
23070 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
23080 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
23090 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
230a0 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
230b0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
230c0 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
230d0 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
230e0 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
230f0 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
23100 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
23110 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
23120 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
23130 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
23140 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
23150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
23160 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
23170 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  e;.  With *pWith
23180 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
23190 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66  (p)->pWith;.  if
231a0 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
231b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
231c0 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
231d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
231e0 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
231f0 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ter;.  }.}.#else
23200 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
23210 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
23220 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23230 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
23240 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
23250 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
23260 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
23270 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
23280 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
23290 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
232a0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
232b0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
232c0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
232d0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
232e0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
232f0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23300 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
23310 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
23320 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
23330 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
23340 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
23350 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
23360 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
23370 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
23380 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
23390 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
233a0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
233b0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
233c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
233d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
233e0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
233f0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
23400 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
23410 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
23420 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
23430 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
23440 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
23450 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
23460 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
23470 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
23480 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
23490 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
234a0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
234b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
234c0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
234d0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
234e0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
234f0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
23500 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
23510 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
23520 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
23530 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
23540 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
23550 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
23560 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
23570 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
23580 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
23590 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
235a0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
235b0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
235c0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
235d0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
235e0 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
235f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
23600 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
23610 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
23620 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
23630 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
23640 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
23650 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
23660 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
23670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
23680 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
23690 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
236a0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
236b0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
236c0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
236d0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
236e0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
236f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23700 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
23710 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23720 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
23730 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23740 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
23750 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
23760 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
23770 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
23780 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
23790 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
237a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
237b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
237c0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
237d0 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
237e0 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
237f0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
23800 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
23810 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
23820 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
23830 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
23840 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73  = p->pEList;.  s
23850 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
23860 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74  Parse, findRight
23870 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20  most(p)->pWith, 
23880 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
23890 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
238a0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
238b0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
238c0 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
238d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
238e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
238f0 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
23900 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
23910 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
23920 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
23930 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
23940 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
23950 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23960 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
23970 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
23980 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
23990 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
239a0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
239b0 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
239c0 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
239d0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
239e0 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
239f0 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
23a00 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
23a10 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
23a20 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
23a30 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
23a40 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
23a50 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73  e *pTab;.    ass
23a60 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65  ert( pFrom->isRe
23a70 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
23a80 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  rom->pTab );.   
23a90 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65   if( pFrom->isRe
23aa0 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
23ab0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ue;.    if( pFro
23ac0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
23ad0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
23ae0 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
23af0 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
23b00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
23b10 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
23b20 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
23b30 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
23b40 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
23b50 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
23b60 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28    selectPopWith(
23b70 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65 6e  pWalker, p);.#en
23b80 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
23b90 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23ba0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23bb0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
23bc0 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
23bd0 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
23be0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23bf0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
23c00 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
23c10 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
23c20 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
23c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23c40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
23c50 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
23c60 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
23c70 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
23c80 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
23c90 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
23ca0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
23cb0 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
23cc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23cd0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23ce0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23cf0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
23d00 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  er, pSel);.     
23d10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
23d20 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
23d30 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23d40 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
23d50 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
23d60 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
23d70 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
23d80 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
23d90 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
23da0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
23db0 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c   "sqlite_sq_%p",
23dc0 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
23dd0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
23de0 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
23df0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
23e00 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
23e10 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
23e20 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
23e30 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
23e40 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
23e50 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
23e60 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23e70 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
23e80 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
23e90 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
23ea0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
23eb0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
23ec0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
23ed0 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
23ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
23ef0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
23f00 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
23f10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23f20 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
23f30 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
23f40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
23f50 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23f60 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
23f70 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
23f80 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
23f90 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
23fa0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
23fc0 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29  ->nRef==0xffff )
23fd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23ff0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
24000 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
24010 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
24020 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
24030 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
24040 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
24050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
24060 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
24070 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
24080 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
24090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
240a0 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
240b0 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
240c0 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
240d0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
240e0 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
240f0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
24100 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
24110 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
24120 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
24130 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
24140 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
24150 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
24160 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
24170 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24180 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
24190 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
241a0 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
241b0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
241c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
241d0 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
241e0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
241f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
24200 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
24210 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
24220 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
24230 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
24240 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
24250 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
24260 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
24270 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
24280 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
24290 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
242a0 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
242b0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
242c0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
242d0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
242e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
242f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
24300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
24310 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
24320 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
24330 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
24340 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
24350 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24360 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
24370 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
24380 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
24390 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
243a0 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
243b0 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
243c0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
243d0 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
243e0 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
243f0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
24400 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
24410 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
24420 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
24430 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
24440 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
24450 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
24460 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
24470 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
24480 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
24490 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
244a0 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
244b0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
244c0 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
244d0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
244e0 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
244f0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
24500 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
24510 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
24520 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
24530 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
24540 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
24550 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
24560 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
24570 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
24580 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
24590 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
245a0 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
245b0 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
245c0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
245d0 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
245e0 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
245f0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
24600 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
24610 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
24620 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
24630 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
24640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24650 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
24660 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
24670 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
24680 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
24690 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
246a0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
246b0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
246c0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
246d0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
246e0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
246f0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
24700 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
24710 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
24720 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
24730 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
24740 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
24750 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
24760 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
24770 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
24780 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
24790 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
247a0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
247b0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
247c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
247d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
247e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
247f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
24800 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
24810 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
24820 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
24830 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
24840 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24860 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
24870 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
24880 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
24890 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
248a0 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
248b0 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
248c0 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
248d0 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
248e0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
248f0 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
24900 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
24910 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
24920 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
24930 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
24940 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
24950 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
24960 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
24970 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
24980 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
24990 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
249a0 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
249b0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
249c0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
249d0 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
249e0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
249f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
24a00 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
24a10 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
24a20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
24a30 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
24a40 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
24a50 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
24a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
24a70 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
24a80 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
24a90 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
24aa0 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
24ab0 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
24ac0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
24ad0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
24ae0 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
24af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24b00 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
24b10 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
24b20 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
24b30 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
24b40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
24b50 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
24b60 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
24b70 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
24b80 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
24b90 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
24ba0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
24bb0 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
24bc0 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
24bd0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
24be0 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
24bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
24c00 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
24c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24c20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
24c30 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
24c40 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
24c50 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
24c60 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
24c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24c80 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
24c90 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
24ca0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
24cb0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
24cc0 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
24cd0 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
24ce0 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
24cf0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
24d00 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
24d10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24d20 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
24d30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
24d40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
24d50 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
24d60 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
24d70 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
24d80 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
24d90 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
24da0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
24db0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
24dc0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
24dd0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
24de0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
24df0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
24e00 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
24e10 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
24e20 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
24e30 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
24e40 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
24e50 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
24e60 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
24e70 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
24e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24e90 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
24ea0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
24eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24ec0 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
24ed0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
24ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24ef0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24f00 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
24f10 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
24f20 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
24f30 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
24f40 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
24f50 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
24f60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
24f70 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
24f80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
24f90 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
24fa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24fb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24fc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24fd0 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
24fe0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
24ff0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
25000 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
25010 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
25020 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
25030 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
25040 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
25050 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
25060 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
25070 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
25080 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
25090 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
250a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
250b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
250c0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
250d0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
250e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
250f0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
25100 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
25110 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
25120 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
25130 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
25140 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
25150 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
25160 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
25170 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
25180 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
25190 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
251a0 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
251b0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
251c0 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
251d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
251e0 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
251f0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
25200 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25210 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
25220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25230 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
25240 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
25250 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
25260 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
25270 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
25280 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
25290 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
252a0 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
252b0 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
252c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
252d0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
252e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
252f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25300 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
25310 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
25320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25330 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
25340 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
25350 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25360 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25370 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
25380 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
25390 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
253a0 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
253c0 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
253d0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
253e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
253f0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
25400 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
25410 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
25420 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
25430 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
25440 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
25450 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
25460 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
25470 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
25480 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
25490 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
254a0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
254d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
254e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
254f0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
25500 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
25510 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
25520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25530 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
25540 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
25550 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
25560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25570 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
25580 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
25590 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
255a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
255b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
255c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
255d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
255e0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
255f0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
25600 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
25610 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
25620 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
25630 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
25640 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
25650 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
25660 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
25670 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
25680 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
256a0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
256b0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
256c0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
256d0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
256e0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
256f0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
25700 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
25710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25720 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25740 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
25750 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
25760 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
25770 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
25780 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
25790 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
257a0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
257b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
257c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
257d0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
257e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
257f0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
25800 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
25810 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
25820 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
25830 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
25840 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
25860 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
25870 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25880 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
25890 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
258a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
258b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
258c0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
258d0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
258e0 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
258f0 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
25900 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
25910 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
25920 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
25930 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
25940 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
25950 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
25960 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
25970 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
25980 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
25990 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
259a0 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
259c0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
259d0 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
259e0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
259f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25a00 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
25a10 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
25a20 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
25a30 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
25a40 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
25a50 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
25a60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25a70 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
25a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
25a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25aa0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
25ab0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
25ac0 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
25ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
25b00 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
25b10 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
25b30 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
25b40 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
25b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25b60 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
25b70 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
25b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25b90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25ba0 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
25bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25bd0 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
25be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
25bf0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
25c00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25c10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
25c20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
25c30 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
25c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
25c60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25c70 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
25c80 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
25c90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
25ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
25cb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
25cc0 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
25cd0 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
25ce0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
25cf0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
25d00 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
25d10 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
25d20 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
25d30 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
25d40 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
25d50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25d60 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
25d70 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
25d80 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
25d90 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
25da0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
25db0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
25dc0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
25dd0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
25de0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
25df0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
25e00 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
25e10 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
25e20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
25e30 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
25e40 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
25e50 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
25e60 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
25e70 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
25e80 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
25e90 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
25ea0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
25eb0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
25ec0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
25ed0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
25ee0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
25ef0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
25f00 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
25f10 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
25f20 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
25f30 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
25f40 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
25f50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
25f60 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
25f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
25f80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
25f90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25fa0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
25fb0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
25fc0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
25fd0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
25fe0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
25ff0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
26000 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
26010 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
26020 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
26030 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
26040 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
26050 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
26060 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
26070 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
26080 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
26090 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
260a0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
260b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
260c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
260d0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
260e0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
260f0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
26100 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
26110 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
26120 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
26130 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
26140 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
26150 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
26160 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
26170 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
26180 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
26190 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
261a0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
261b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
261c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
261d0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
261e0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
261f0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
26200 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
26210 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
26220 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
26230 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
26240 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
26250 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
26260 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
26270 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
26280 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
26290 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
262a0 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
262b0 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
262c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
262d0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
262e0 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
262f0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
26300 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
26310 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
26320 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
26330 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
26340 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
26350 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
26360 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26370 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
26380 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
26390 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
263a0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
263b0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
263c0 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
263d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
263e0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
263f0 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
26400 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
26410 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
26420 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
26430 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
26440 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
26450 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
26460 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
26470 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
26480 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
26490 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
264a0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
264b0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
264c0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
264d0 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
264e0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
264f0 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
26500 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
26510 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
26520 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
26530 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
26540 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
26550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
26560 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
26570 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
26580 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
26590 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
265a0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
265b0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
265c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
265d0 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
265e0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
265f0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
26600 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
26610 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
26620 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
26630 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
26640 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26650 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
26660 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
26670 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
26680 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
26690 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
266a0 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
266b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
266c0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
266d0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
266e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
266f0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
26700 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
26710 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
26720 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
26730 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62  Tab!=0) && (pTab
26740 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
26750 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
26760 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
26770 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
26780 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
26790 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
267a0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
267b0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
267c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
267d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  l ){.          w
267e0 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
267f0 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
26800 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
26810 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
26820 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
26830 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
26840 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pSel);.       
26850 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
26860 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
26870 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26880 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
26890 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
268a0 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
268b0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
268c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
268d0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
268e0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
268f0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
26900 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
26910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
26920 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
26930 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
26940 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
26950 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
26960 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
26970 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
26980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26990 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
269a0 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
269b0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
269c0 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
269d0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
269e0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
269f0 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
26a00 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
26a10 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
26a20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
26a30 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
26a40 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
26a50 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
26a60 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
26a70 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
26a80 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
26a90 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
26aa0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
26ab0 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
26ac0 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
26ad0 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
26ae0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
26af0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
26b00 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
26b10 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
26b20 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
26b30 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
26b40 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
26b50 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
26b60 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
26b70 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
26b80 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
26b90 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
26ba0 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
26bb0 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
26bc0 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
26bd0 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
26be0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
26bf0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
26c00 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
26c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26c20 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
26c30 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
26c40 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
26c50 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
26c60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
26c70 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
26c80 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
26c90 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
26ca0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
26cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26cc0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
26cd0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
26ce0 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
26cf0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
26d00 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
26d10 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
26d20 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26d30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
26d40 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
26d50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26d60 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26d70 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
26d80 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
26d90 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
26da0 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
26db0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
26dc0 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
26dd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
26de0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
26df0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
26e00 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
26e10 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
26e20 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
26e30 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
26e40 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
26e50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
26e60 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
26e70 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
26e80 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
26e90 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
26ea0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
26eb0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
26ec0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
26ed0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
26ee0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
26ef0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
26f00 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
26f10 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
26f20 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
26f30 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
26f40 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
26f50 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
26f60 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
26f70 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
26f80 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
26f90 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
26fa0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
26fb0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
26fc0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
26fd0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
26fe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
26ff0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
27000 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
27010 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
27020 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
27030 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
27040 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
27050 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
27060 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
27070 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
27080 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
27090 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
270a0 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
270b0 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
270c0 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
270d0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
270e0 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
270f0 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
27100 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
27110 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
27120 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
27130 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
27140 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
27150 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
27160 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
27170 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
27180 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
27190 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
271a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
271b0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
271c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
271d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
271e0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
271f0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
27200 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
27210 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
27220 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
27230 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
27240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27250 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
27260 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
27270 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
27280 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
27290 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
272a0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
272b0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
272c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
272d0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
272e0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
272f0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
27300 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
27310 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27320 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
27330 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
27340 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
27350 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
27360 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
27370 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27380 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
27390 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
273a0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
273b0 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
273c0 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
273d0 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
273e0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
273f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27400 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
27410 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
27420 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
27430 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
27440 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
27450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27460 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
27470 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
27480 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
274b0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
274c0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
274d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
274e0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
274f0 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
27500 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
27510 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
27520 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
27530 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
27540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
27550 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
27560 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
27570 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
27580 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
27590 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
275a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
275b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
275c0 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
275d0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
275e0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
275f0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
27600 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
27610 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
27620 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
27630 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
27640 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
27650 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
27660 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
27670 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
27680 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
27690 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
276a0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
276b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
276c0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
276d0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
276e0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
276f0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
27700 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
27710 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
27720 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
27730 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
27740 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
27750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27760 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
27770 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
27780 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
27790 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
277a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
277b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
277c0 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
277d0 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
277e0 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
277f0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
27800 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
27810 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
27820 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
27830 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
27840 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
27850 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
27860 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
27870 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
27880 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
27890 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
278a0 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
278b0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
278c0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
278d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
278e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
278f0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
27900 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
27910 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
27920 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
27930 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
27940 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
27950 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
27960 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
27970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
27980 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
27990 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c  ist, regAgg, SQL
279a0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
279b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
279c0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
279d0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
279e0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
279f0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
27a00 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
27a10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27a20 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
27a30 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
27a40 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
27a50 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
27a60 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
27a70 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
27a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27a90 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
27aa0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
27ab0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
27ac0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
27ad0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
27ae0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
27af0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
27b00 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
27b10 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
27b20 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
27b30 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
27b40 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
27b50 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
27b60 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
27b70 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
27b80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
27b90 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
27ba0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
27bb0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
27bc0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
27bd0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
27be0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
27bf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
27c00 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
27c10 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
27c20 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
27c30 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
27c40 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
27c50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
27c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27c70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
27c80 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
27c90 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
27ca0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
27cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27cc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
27cd0 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
27ce0 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
27d10 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
27d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
27d30 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
27d40 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
27d50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
27d60 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
27d70 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
27d80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
27d90 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
27da0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
27db0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
27dc0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
27dd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27de0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
27df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27e00 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27e10 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
27e20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
27e30 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
27e40 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
27e50 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
27e60 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
27e70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27e80 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
27e90 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
27ea0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
27eb0 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
27ec0 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
27ed0 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
27ee0 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
27ef0 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
27f00 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
27f10 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
27f20 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
27f30 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
27f40 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
27f50 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
27f60 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
27f70 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
27f80 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
27f90 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
27fa0 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
27fb0 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
27fc0 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
27fd0 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
27fe0 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
27ff0 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
28000 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
28010 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
28020 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
28030 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
28040 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
28050 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
28060 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
28070 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
28080 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
28090 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
280a0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
280b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
280c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
280d0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
280e0 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
280f0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
28100 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
28110 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
28120 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
28130 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
28140 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
28150 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
28160 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
28170 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
28180 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28190 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
281a0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
281b0 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
281c0 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
281d0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
281e0 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
281f0 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
28200 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
28210 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
28220 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
28230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
28240 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
28250 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
28260 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
28270 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
28280 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
28290 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
282a0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282c0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
282d0 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
282e0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
282f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28300 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
28310 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
28320 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
28330 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
28340 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
28350 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
28360 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
28370 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
28380 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
28390 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
283a0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
283b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
283c0 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
283d0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
283e0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
283f0 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
28400 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
28410 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
28420 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
28430 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
28440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28450 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
28460 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
28470 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
28480 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
28490 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
284a0 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
284b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
284c0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
284d0 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
284e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
284f0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
28500 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
28510 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
28520 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
28530 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
28540 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
28550 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
28560 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
28570 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
28580 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
28590 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
285a0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
285b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
285c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
285d0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
285e0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
285f0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
28600 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
28610 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
28620 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
28630 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
28640 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
28650 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
28660 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
28670 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
28680 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
28690 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
286a0 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
286b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
286c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
286d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
286e0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
286f0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
28700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28710 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28720 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
28730 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
28740 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
28750 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
28760 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
28770 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28790 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
287a0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
287b0 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
287c0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
287d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
287e0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
287f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28800 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
28810 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
28820 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
28830 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
28840 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
28850 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
28860 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
28870 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
28880 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
28890 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
288a0 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
288b0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
288c0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
288d0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
288e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
288f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
28900 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
28910 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
28920 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
28930 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
28940 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
28950 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
28960 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
28970 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
28980 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
28990 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
289a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
289b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
289c0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
289d0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
289e0 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
289f0 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
28a00 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
28a10 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
28a20 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
28a30 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
28a40 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
28a50 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
28a60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
28a70 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
28a80 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
28a90 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
28aa0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
28ab0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
28ac0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
28ad0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
28ae0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
28af0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
28b00 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
28b10 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
28b20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
28b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28b40 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
28b50 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
28b60 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
28b70 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
28b80 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
28b90 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
28ba0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
28bb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28bc0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
28bd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28be0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
28bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
28c00 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
28c10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
28c20 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
28c30 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
28c40 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
28c50 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
28c60 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
28c70 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
28c80 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
28c90 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
28ca0 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
28cb0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
28cc0 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
28cd0 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
28ce0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
28cf0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
28d00 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
28d10 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
28d20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
28d30 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
28d40 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
28d50 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
28d60 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
28d70 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
28d80 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
28d90 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
28da0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
28db0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
28dc0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
28dd0 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
28de0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28df0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28e00 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
28e10 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
28e20 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
28e30 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
28e40 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
28e50 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
28e60 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
28e70 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
28e80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28e90 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
28ea0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
28eb0 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
28ec0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
28ed0 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
28ee0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28ef0 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
28f00 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
28f10 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
28f20 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
28f30 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
28f40 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
28f50 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
28f60 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
28f70 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
28f80 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
28f90 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
28fa0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
28fb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
28fc0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28fd0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
28fe0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
28ff0 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
29000 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
29010 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
29020 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
29030 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
29040 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
29050 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
29060 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
29070 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
29080 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
29090 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
290a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
290b0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
290c0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
290d0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
290e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
290f0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
29100 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
29110 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
29120 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
29130 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
29140 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
29150 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
29160 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
29170 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
29180 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
29190 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
291a0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
291b0 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
291c0 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
291d0 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
291e0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
291f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29200 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
29210 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
29220 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
29230 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
29240 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
29250 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
29260 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
29270 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
29280 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
29290 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
292a0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
292b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
292c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
292d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
292e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
292f0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
29300 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
29310 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
29320 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
29330 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
29340 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
29350 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
29360 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
29370 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
29380 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
29390 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
293a0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
293b0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
293c0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
293d0 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
293e0 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
293f0 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
29400 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
29410 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
29420 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
29430 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
29440 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
29450 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
29460 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
29470 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
29480 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
29490 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
294a0 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
294b0 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
294c0 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
294d0 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
294e0 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
294f0 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
29500 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
29510 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
29520 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
29530 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
29540 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
29550 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
29560 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
29570 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
29580 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
29590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
295a0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
295b0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
295c0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
295d0 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
295e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
295f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
29600 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
29610 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
29620 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
29630 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
29640 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
29650 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
29660 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
29670 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
29680 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
29690 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
296a0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
296b0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
296c0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
296d0 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
296e0 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
296f0 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
29700 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
29710 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
29720 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
29730 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
29740 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
29750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
29760 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
29770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
29780 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
29790 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
297a0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
297b0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
297c0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
297d0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
297e0 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
297f0 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
29800 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
29810 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
29820 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
29830 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
29840 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
29850 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
29860 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
29870 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
29880 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
29890 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
298a0 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
298b0 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
298c0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
298d0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
298e0 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
298f0 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
29900 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
29910 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
29920 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
29930 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
29940 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
29950 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
29960 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
29970 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
29980 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
29990 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
299a0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
299b0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
299c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
299d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
299e0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
299f0 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
29a00 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
29a10 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
29a20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
29a30 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
29a40 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
29a50 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
29a60 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
29a70 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
29a80 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
29a90 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
29aa0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29ab0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
29ac0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
29ad0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
29ae0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
29af0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
29b00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
29b10 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
29b20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
29b30 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
29b40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
29b50 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
29b60 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  w);.      pItem-
29b70 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  >viaCoroutine = 
29b80 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
29b90 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
29ba0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
29bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29bc0 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
29bd0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
29be0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
29bf0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29c00 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
29c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
29c20 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
29c30 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
29c40 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
29c50 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
29c60 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
29c70 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
29c80 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
29c90 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
29ca0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
29cb0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29cc0 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
29cd0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
29ce0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
29cf0 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
29d00 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
29d10 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
29d20 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
29d30 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
29d40 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
29d50 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
29d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
29d70 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
29d80 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
29d90 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
29da0 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
29db0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
29dc0 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
29dd0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
29de0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
29df0 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
29e00 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
29e10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
29e20 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
29e30 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
29e40 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29e50 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
29e60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
29e70 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  ->isCorrelated==
29e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
29e90 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
29ea0 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
29eb0 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
29ec0 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
29ed0 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
29ee0 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
29ef0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
29f00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29f10 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
29f20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
29f30 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
29f40 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
29f50 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
29f60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29f70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29f80 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
29f90 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
29fa0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29fc0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
29fd0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
29fe0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
29ff0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2a000 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2a010 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2a020 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2a030 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
2a040 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2a050 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2a060 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2a070 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2a080 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2a090 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2a0a0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2a0b0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2a0c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2a0d0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
2a0e0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
2a0f0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
2a100 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
2a110 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
2a120 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
2a130 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
2a140 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2a150 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2a160 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
2a170 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2a180 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2a190 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
2a1a0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2a1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a1c0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
2a1d0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
2a1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2a1f0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2a200 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2a210 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
2a220 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
2a230 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2a240 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2a250 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
2a260 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
2a270 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2a280 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
2a290 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2a2a0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
2a2b0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2a2c0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
2a2d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2a2e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2a2f0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
2a300 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
2a310 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
2a320 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
2a330 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2a340 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
2a350 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
2a360 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2a370 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2a380 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
2a390 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2a3a0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2a3b0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
2a3c0 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
2a3d0 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
2a3e0 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
2a3f0 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
2a400 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2a410 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2a420 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2a430 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2a440 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2a450 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2a460 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2a470 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2a480 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2a490 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2a4a0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2a4b0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2a4c0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2a4d0 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2a4e0 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2a4f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2a500 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2a510 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
2a520 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
2a530 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
2a540 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
2a550 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
2a560 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
2a570 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
2a580 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
2a590 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
2a5a0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
2a5b0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2a5c0 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
2a5d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
2a5e0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
2a5f0 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
2a600 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2a610 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2a620 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
2a630 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
2a640 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
2a650 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
2a660 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
2a670 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
2a680 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
2a690 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
2a6a0 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
2a6b0 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
2a6c0 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
2a6d0 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
2a6e0 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
2a6f0 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
2a700 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
2a710 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
2a720 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
2a730 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
2a740 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
2a750 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
2a760 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
2a770 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
2a780 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
2a790 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
2a7a0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2a7b0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2a7c0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
2a7d0 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
2a7e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a7f0 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
2a800 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
2a810 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2a820 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2a830 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2a840 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
2a850 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2a860 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
2a870 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
2a880 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2a890 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f  By;.    sSort.pO
2a8a0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2a8b0 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2a8c0 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2a8d0 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2a8e0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2a8f0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2a900 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2a910 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2a920 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2a930 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2a940 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2a950 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2a960 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2a970 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2a980 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2a990 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2a9a0 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2a9b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2a9c0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2a9d0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2a9e0 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
2a9f0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2aa00 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
2aa10 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
2aa20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
2aa30 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2aa40 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
2aa50 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2aa60 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
2aa70 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2aa80 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2aa90 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2aaa0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
2aab0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2aac0 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2aad0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
2aae0 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
2aaf0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
2ab00 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2ab10 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
2ab20 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2ab30 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2ab40 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2ab50 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2ab60 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2ab70 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2ab80 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2ab90 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
2aba0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2abb0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2abc0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2abd0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2abe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2abf0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2ac00 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2ac10 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2ac20 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2ac30 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2ac40 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2ac50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2ac60 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2ac70 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2ac80 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2ac90 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2aca0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2acb0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2acc0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2acd0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2ace0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2acf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2ad00 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2ad10 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2ad20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ad30 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2ad40 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2ad50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2ad60 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2ad70 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2ad80 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2ad90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2ada0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
2adb0 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
2adc0 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
2add0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2ade0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2adf0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2ae00 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2ae10 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2ae20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2ae30 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
2ae40 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
2ae50 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
2ae60 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
2ae70 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2ae80 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2ae90 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2aea0 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
2aeb0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2aec0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2aed0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2aee0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2aef0 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2af00 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2af10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2af20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2af30 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2af40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2af50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2af80 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2af90 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2afc0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2afd0 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2afe0 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2b010 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2b020 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2b030 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2b040 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2b050 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2b060 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2b070 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2b080 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2b090 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2b0a0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2b0b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2b0c0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2b0d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2b0e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2b0f0 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2b100 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2b110 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2b120 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2b130 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2b140 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2b150 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2b160 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2b170 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2b180 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2b190 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2b1a0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2b1b0 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2b1e0 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2b1f0 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2b200 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2b210 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2b220 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2b230 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2b240 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2b250 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2b260 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2b270 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2b280 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2b290 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2b2a0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2b2b0 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2b2c0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2b2d0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2b2e0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2b2f0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2b300 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2b310 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2b320 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2b330 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2b340 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2b350 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2b360 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2b370 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2b380 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2b390 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2b3a0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2b3b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2b3c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2b3d0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2b3e0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2b3f0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2b400 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2b410 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2b420 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2b430 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2b440 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2b450 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2b460 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2b470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b480 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2b490 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2b4a0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2b4b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b4c0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2b4d0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2b4e0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2b4f0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2b500 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2b510 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2b520 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2b530 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2b540 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2b550 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b570 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2b580 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2b590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b5a0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2b5b0 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2b5c0 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2b5d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2b5e0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2b5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2b600 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2b610 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2b620 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2b630 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2b640 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2b650 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2b660 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2b670 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2b680 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2b690 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2b6a0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2b6b0 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2b6c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2b6d0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2b6e0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2b6f0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2b700 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2b710 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2b720 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b730 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2b740 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2b750 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2b760 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2b770 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2b780 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2b790 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2b7a0 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2b7c0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2b7d0 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2b7e0 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2b810 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2b820 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2b830 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2b840 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2b850 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2b860 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2b870 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2b880 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2b890 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2b8a0 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2b8b0 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2b8c0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2b8d0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2b8e0 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2b8f0 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2b900 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2b910 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2b920 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2b930 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2b940 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2b950 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2b960 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2b970 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2b980 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2b990 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2b9a0 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2b9b0 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2b9c0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2b9d0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2b9e0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2b9f0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2ba00 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2ba10 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2ba20 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2ba30 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2ba40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ba50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ba60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2ba70 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2ba80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2ba90 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2baa0 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2bab0 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2bac0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2bad0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2bae0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2baf0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2bb00 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2bb10 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2bb20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bb30 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2bb40 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2bb50 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2bb60 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2bb70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2bb80 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2bb90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2bba0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2bbb0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2bbc0 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2bbd0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2bbe0 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2bbf0 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2bc00 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2bc10 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2bc20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2bc30 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2bc40 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2bc50 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2bc60 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2bc70 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2bc80 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2bc90 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2bca0 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2bcb0 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2bcc0 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2bcd0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2bce0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2bcf0 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2bd00 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2bd10 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2bd20 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2bd30 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2bd40 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2bd50 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2bd60 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2bd70 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2bd80 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2bd90 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2bda0 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2bdb0 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2bdc0 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2bdd0 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2bde0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2bdf0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2be00 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2be10 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2be20 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2be30 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2be40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2be50 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2be60 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2be70 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2be80 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2be90 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2bea0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2beb0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2bec0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2bed0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2bee0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2bef0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2bf00 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2bf10 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2bf20 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2bf30 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2bf40 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2bf50 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2bf60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2bf70 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2bf80 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2bf90 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2bfa0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2bfb0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2bfc0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2bfd0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2bfe0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2bff0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2c000 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2c010 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2c020 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2c030 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2c040 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2c050 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2c060 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2c070 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2c080 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2c090 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2c0a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2c0b0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2c0c0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2c0d0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2c0e0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2c0f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c100 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2c110 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2c120 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2c130 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2c140 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2c150 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c160 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2c170 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2c180 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c190 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2c1a0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2c1b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2c1c0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2c1d0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2c1e0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2c1f0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2c200 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2c210 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2c220 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2c230 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2c240 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2c250 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2c260 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2c270 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2c280 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2c290 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2c2a0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2c2b0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2c2c0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2c2d0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2c2e0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2c2f0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2c300 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2c310 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2c320 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2c330 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2c340 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2c350 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2c360 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2c370 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2c380 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2c390 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2c3a0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2c3b0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2c3c0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2c3d0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2c3e0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2c3f0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2c400 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2c410 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2c420 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2c430 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2c440 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2c450 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2c460 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2c470 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2c480 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2c490 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2c4a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2c4b0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2c4c0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2c4d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2c4e0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2c4f0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2c500 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2c510 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2c520 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2c530 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2c540 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2c550 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2c560 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2c570 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2c580 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2c590 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2c5a0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2c5b0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2c5c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2c5d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2c5e0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2c5f0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2c600 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2c610 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2c620 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2c630 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2c640 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2c650 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2c660 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2c670 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2c680 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2c690 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2c6a0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2c6b0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2c6c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2c6d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2c6e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c6f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2c700 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c710 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c720 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
2c730 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2c740 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2c750 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2c760 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2c770 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2c780 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2c790 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2c7a0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2c7b0 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2c7c0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2c7d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2c7e0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2c7f0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2c800 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2c810 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2c820 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2c830 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2c840 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2c850 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2c860 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2c870 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2c880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c890 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2c8a0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2c8b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2c8c0 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2c8d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c8e0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2c8f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2c900 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2c910 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2c920 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2c930 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2c940 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2c950 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2c960 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2c970 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2c980 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2c990 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2c9a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c9b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2c9c0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2c9d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c9e0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2c9f0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2ca00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ca10 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2ca20 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2ca30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ca40 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2ca50 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2ca60 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2ca70 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2ca80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2ca90 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2caa0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2cab0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2cac0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2cad0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2cae0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2caf0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2cb00 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2cb10 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2cb20 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2cb30 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2cb40 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2cb50 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2cb60 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2cb70 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2cb80 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2cb90 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2cba0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2cbb0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2cbc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2cbd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2cbe0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2cbf0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2cc00 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2cc10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2cc20 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2cc30 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2cc40 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2cc50 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2cc60 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2cc70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2cc80 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2cc90 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2cca0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2ccb0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2ccc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2ccd0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2cce0 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2ccf0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2cd00 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2cd10 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2cd20 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2cd30 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2cd40 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2cd50 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2cd60 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2cd70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2cd80 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2cd90 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2cda0 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2cdb0 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2cdc0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2cdd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2cde0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2cdf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ce00 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2ce10 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2ce20 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2ce30 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2ce40 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2ce50 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2ce60 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2ce70 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2ce80 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2ce90 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2cea0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2ceb0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2cec0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2ced0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2cee0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2cef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2cf00 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2cf10 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2cf20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2cf30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2cf40 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2cf50 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2cf60 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2cf70 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2cf80 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2cf90 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2cfa0 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2cfd0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2cfe0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2cff0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2d000 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2d010 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2d020 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2d030 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2d040 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2d050 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2d060 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2d070 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d080 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2d090 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2d0a0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2d0b0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2d0c0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2d0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d0e0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2d0f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2d100 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2d110 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2d120 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d130 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2d140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2d150 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2d160 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2d170 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
2d180 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2d190 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2d1a0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2d1b0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2d1c0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2d1d0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
2d1e0 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
2d1f0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
2d200 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2d210 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2d220 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
2d230 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
2d240 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
2d250 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
2d260 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
2d270 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
2d280 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
2d2b0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
2d2c0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
2d2d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d2e0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d310 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
2d320 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2d330 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d340 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2d350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d360 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
2d370 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2d380 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2d390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d3a0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
2d3b0 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
2d3c0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
2d3d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d3e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d3f0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
2d400 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2d410 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
2d420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2d430 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2d440 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
2d450 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d460 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2d470 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
2d480 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2d490 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2d4a0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2d4b0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2d4c0 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
2d4d0 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
2d4e0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2d4f0 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
2d500 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2d510 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2d520 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2d530 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
2d540 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
2d550 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
2d560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d570 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2d580 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
2d590 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2d5a0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
2d5b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2d5c0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
2d5d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d5e0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2d5f0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
2d600 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2d610 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2d620 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
2d630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2d640 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
2d650 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
2d660 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
2d670 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
2d680 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
2d690 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
2d6a0 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
2d6b0 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
2d6c0 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
2d6d0 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
2d6e0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2d6f0 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
2d700 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
2d710 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
2d720 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2d730 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2d740 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
2d750 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
2d760 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
2d770 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2d780 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
2d790 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2d7a0 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
2d7b0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
2d7c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
2d7d0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
2d7e0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
2d7f0 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
2d800 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2d810 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
2d820 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
2d830 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
2d840 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
2d850 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
2d860 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
2d870 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2d880 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d8a0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d8b0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d8c0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2d8d0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2d8e0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2d8f0 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2d900 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2d910 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2d920 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2d930 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2d940 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2d950 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2d960 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2d970 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2d980 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2d990 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2d9a0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2d9b0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2d9c0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2d9d0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2d9e0 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2d9f0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2da00 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2da10 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2da20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2da30 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2da40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2da50 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2da60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2da70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2da80 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2da90 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2daa0 20 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50 54 61   sortOut,sortPTa
2dab0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2dac0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
2dad0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
2dae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2daf0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2db00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2db10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2db20 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61  _Column, sortPTa
2db30 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  b, j, iBMem+j);.
2db40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2db50 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2db60 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
2db70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2db80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2db90 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
2dba0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
2dbb0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
2dbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2dbd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2dbe0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
2dbf0 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
2dc00 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
2dc30 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
2dc40 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
2dc50 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
2dc60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2dc70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2dc80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dc90 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
2dca0 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
2dcb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2dcc0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2dcd0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
2dce0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
2dcf0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
2dd00 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
2dd10 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
2dd20 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
2dd30 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2dd40 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
2dd50 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
2dd60 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
2dd70 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
2dd80 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
2dd90 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
2dda0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
2ddb0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
2ddc0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
2ddd0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
2dde0 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
2ddf0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
2de00 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2de10 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
2de20 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
2de30 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2de40 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
2de50 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
2de60 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
2de70 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
2de80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2de90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
2dea0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
2deb0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
2dec0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2ded0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2dee0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2def0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2df00 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2df10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2df20 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
2df30 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
2df40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2df50 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
2df60 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
2df70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2df80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2df90 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
2dfa0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2dfb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2dfc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2dfd0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2dfe0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2dff0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e000 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
2e010 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2e020 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
2e030 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e040 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
2e050 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
2e060 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2e070 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
2e080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2e090 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
2e0a0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2e0b0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2e0c0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2e0d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e0e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2e0f0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
2e100 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e110 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2e120 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
2e130 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2e140 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2e150 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
2e160 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2e170 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2e180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e190 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
2e1a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2e1b0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
2e1c0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
2e1d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2e1e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e1f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2e200 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2e210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e220 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
2e230 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
2e240 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2e250 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
2e260 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
2e270 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e290 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2e2a0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2e2b0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2e2c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2e2d0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
2e2e0 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
2e2f0 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
2e300 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
2e310 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2e320 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e330 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
2e340 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
2e350 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2e360 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2e370 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
2e380 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2e390 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
2e3a0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
2e3b0 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
2e3c0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
2e3d0 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
2e3e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2e3f0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
2e400 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
2e410 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
2e420 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
2e430 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
2e440 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
2e450 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
2e460 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
2e470 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
2e480 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
2e490 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
2e4a0 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
2e4b0 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
2e4c0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
2e4d0 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
2e4e0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
2e4f0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
2e500 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2e510 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e520 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e530 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
2e540 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2e550 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e560 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
2e570 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e580 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e590 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2e5a0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
2e5b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2e5c0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
2e5d0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2e5e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2e5f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2e600 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2e610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e620 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
2e630 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
2e640 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65  tputRow+2); Vdbe
2e650 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2e660 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2e670 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
2e680 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
2e690 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
2e6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e6b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2e6c0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2e6d0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
2e6e0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
2e6f0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2e700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e710 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2e720 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
2e730 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
2e740 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2e750 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
2e760 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2e770 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
2e780 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2e7a0 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2e7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e7c0 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
2e7d0 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
2e7e0 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
2e7f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2e800 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2e810 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2e820 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e830 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
2e840 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
2e850 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
2e860 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2e870 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2e880 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
2e890 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
2e8a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2e8b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2e8c0 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
2e8d0 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
2e8e0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2e8f0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2e900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e910 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2e920 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
2e930 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
2e940 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
2e950 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
2e960 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
2e970 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
2e980 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
2e990 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
2e9a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e9b0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
2e9c0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2e9d0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
2e9e0 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
2e9f0 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
2ea00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ea10 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
2ea20 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
2ea30 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
2ea40 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
2ea50 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
2ea60 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2ea70 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
2ea80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ea90 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
2eaa0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
2eab0 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
2eac0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
2ead0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2eae0 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
2eaf0 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
2eb00 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
2eb10 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
2eb20 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
2eb30 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
2eb40 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
2eb50 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
2eb60 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
2eb70 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
2eb80 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
2eb90 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
2eba0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2ebb0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2ebc0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
2ebd0 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
2ebe0 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
2ebf0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
2ec00 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
2ec10 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
2ec20 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
2ec30 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
2ec40 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
2ec50 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
2ec60 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
2ec70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2ec80 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
2ec90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2eca0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
2ecb0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
2ecc0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
2ecd0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2ece0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
2ecf0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ed00 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
2ed10 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
2ed20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2ed30 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed50 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2ed60 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2ed70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2ed80 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
2ed90 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
2eda0 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
2edb0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
2edc0 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ede0 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2edf0 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
2ee00 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
2ee10 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee30 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
2ee40 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
2ee50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2ee60 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2ee70 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2ee80 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2ee90 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2eea0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2eeb0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2eec0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
2eed0 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
2eee0 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
2eef0 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
2ef00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2ef10 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
2ef20 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
2ef30 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
2ef40 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
2ef50 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2ef60 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
2ef70 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
2ef80 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
2ef90 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
2efa0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2efb0 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
2efc0 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
2efd0 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
2efe0 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
2eff0 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
2f000 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
2f010 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
2f020 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
2f030 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2f040 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
2f050 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
2f060 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2f070 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
2f080 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2f090 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2f0a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
2f0b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
2f0c0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2f0d0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
2f0e0 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
2f0f0 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
2f100 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
2f110 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
2f120 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
2f130 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
2f140 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
2f150 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
2f160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f170 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
2f180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f190 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2f1a0 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
2f1b0 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
2f1c0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
2f1d0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
2f1e0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
2f1f0 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
2f200 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2f210 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
2f220 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
2f230 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
2f240 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
2f250 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
2f260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f270 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
2f280 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
2f290 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
2f2a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
2f2b0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2f2c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f2d0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
2f2e0 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
2f2f0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2f300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2f310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f320 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
2f330 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
2f340 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
2f350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f360 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2f370 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
2f380 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
2f390 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
2f3a0 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
2f3b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2f3c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2f3d0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
2f3e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
2f3f0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
2f400 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
2f410 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
2f420 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2f430 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2f440 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
2f450 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
2f460 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
2f470 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
2f480 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
2f490 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
2f4a0 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
2f4b0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
2f4c0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
2f4d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
2f4e0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
2f4f0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
2f500 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
2f510 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
2f520 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
2f530 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
2f540 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
2f550 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
2f560 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
2f570 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
2f580 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
2f590 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
2f5a0 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
2f5b0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
2f5c0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
2f5d0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2f5e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
2f5f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2f600 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
2f610 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
2f620 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
2f630 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
2f640 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
2f650 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
2f660 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
2f670 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
2f680 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
2f690 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
2f6a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2f6b0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
2f6c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
2f6d0 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
2f6e0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
2f6f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
2f700 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2f710 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
2f720 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
2f730 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
2f740 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
2f750 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
2f760 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
2f770 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
2f780 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
2f790 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
2f7a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f7b0 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
2f7c0 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
2f7d0 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
2f7e0 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
2f7f0 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
2f800 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
2f810 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
2f820 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
2f830 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
2f840 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2f850 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
2f860 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
2f870 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
2f880 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
2f890 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
2f8a0 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
2f8b0 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
2f8c0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
2f8d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f8e0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
2f8f0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
2f900 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
2f910 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
2f920 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2f930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
2f940 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
2f950 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
2f960 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
2f970 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
2f980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2f990 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
2f9a0 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
2f9b0 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
2f9c0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2f9d0 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
2f9e0 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
2f9f0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
2fa00 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
2fa10 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2fa20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
2fa30 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2fa40 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
2fa50 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
2fa60 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
2fa70 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
2fa80 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2fa90 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
2faa0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2fab0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
2fac0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
2fad0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
2fae0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
2faf0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
2fb00 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
2fb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fb20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
2fb30 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
2fb40 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2fb50 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
2fb60 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
2fb70 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
2fb80 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
2fb90 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
2fba0 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2fbb0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
2fbc0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
2fbd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
2fbe0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
2fbf0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2fc00 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2fc10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2fc20 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2fc30 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2fc40 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2fc50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2fc60 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2fc70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2fc80 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2fc90 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2fca0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2fcb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fcc0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2fcd0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2fce0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2fcf0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2fd00 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2fd10 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2fd20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2fd30 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2fd40 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
2fd50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2fd70 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65  o, 0, sqlite3Whe
2fd80 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2fd90 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
2fda0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2fdb0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
2fdc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fdd0 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
2fde0 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
2fdf0 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
2fe00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2fe10 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2fe20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
2fe30 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2fe40 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2fe50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
2fe60 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2fe70 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2fe80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2fe90 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2fea0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
2feb0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2fec0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2fed0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2fee0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2fef0 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2ff10 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2ff20 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2ff30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2ff40 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2ff50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ff60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ff70 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2ff80 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2ff90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2ffa0 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2ffb0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2ffc0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2ffd0 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2ffe0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2fff0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
30000 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
30010 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
30020 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
30030 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
30040 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
30050 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
30060 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
30070 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
30080 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
30090 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
300a0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
300b0 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e  (pParse, sSort.n
300c0 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54  OBSat>0 ? "RIGHT
300d0 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42   PART OF ORDER B
300e0 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  Y":"ORDER BY");.
300f0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
30100 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
30110 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e  &sSort, pEList->
30120 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
30130 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
30140 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
30150 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
30160 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30170 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
30180 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
30190 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
301a0 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
301b0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
301c0 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
301d0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
301e0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
301f0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
30200 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
30210 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
30220 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
30230 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
30240 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
30250 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
30260 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
30270 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
30280 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
30290 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
302a0 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
302b0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
302c0 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
302d0 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
302e0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
302f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30300 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
30310 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
30320 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
30330 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
30340 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
30350 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
30360 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30370 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
30380 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
30390 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
303a0 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  nc);.#if SELECTT
303b0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53  RACE_ENABLED.  S
303c0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
303d0 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63  rse,p,("end proc
303e0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70  essing\n"));.  p
303f0 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
30400 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
30410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
30420 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30430 55 47 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  UG.void sqlite3P
30440 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
30450 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  );.void sqlite3P
30460 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70  rintExprList(Exp
30470 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 3b 0a 76  rList *pList);.v
30480 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
30490 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
304a0 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 3b 0a 2f  , int indent);./
304b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
304c0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
304d0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
304e0 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
304f0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
30500 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
30510 28 54 72 65 65 56 69 65 77 20 2a 70 56 69 65 77  (TreeView *pView
30520 2c 20 63 6f 6e 73 74 20 53 65 6c 65 63 74 20 2a  , const Select *
30530 70 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c  p, u8 moreToFoll
30540 6f 77 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ow){.  int n = 0
30550 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  ;.  pView = sqli
30560 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
30570 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
30580 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  low);.  sqlite3T
30590 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
305a0 77 2c 20 22 53 45 4c 45 43 54 25 73 25 73 22 2c  w, "SELECT%s%s",
305b0 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61  .    ((p->selFla
305c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
305d0 29 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20  ) ? " DISTINCT" 
305e0 3a 20 22 22 29 2c 0a 20 20 20 20 28 28 70 2d 3e  : ""),.    ((p->
305f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30600 67 72 65 67 61 74 65 29 20 3f 20 22 20 61 67 67  gregate) ? " agg
30610 5f 66 6c 61 67 22 20 3a 20 22 22 29 0a 20 20 29  _flag" : "").  )
30620 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
30630 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
30640 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
30650 3e 70 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20  >pWhere ) n++;. 
30660 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
30670 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
30680 3e 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a  >pHaving ) n++;.
30690 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
306a0 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70  y ) n++;.  if( p
306b0 2d 3e 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a  ->pLimit ) n++;.
306c0 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
306d0 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
306e0 3e 70 50 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a 20  >pPrior ) n++;. 
306f0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30700 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
30710 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29  p->pEList, (n--)
30720 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73 65 74 22  >0, "result-set"
30730 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
30740 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
30750 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  c ){.    int i;.
30760 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69      pView = sqli
30770 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
30780 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b  pView, (n--)>0);
30790 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
307a0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
307b0 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20 66 6f 72  "FROM");.    for
307c0 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
307d0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
307e0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
307f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
30800 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
30810 20 20 20 20 20 20 53 74 72 41 63 63 75 6d 20 78        StrAccum x
30820 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69  ;.      char zLi
30830 6e 65 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 73  ne[100];.      s
30840 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
30850 69 74 28 26 78 2c 20 7a 4c 69 6e 65 2c 20 73 69  it(&x, zLine, si
30860 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b  zeof(zLine), 0);
30870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
30880 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 7b 25  rintf(&x, 0, "{%
30890 64 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43  d,*}", pItem->iC
308a0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
308b0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
308c0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
308d0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
308e0 20 30 2c 20 22 20 25 73 2e 25 73 22 2c 20 70 49   0, " %s.%s", pI
308f0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
30900 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
30910 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
30920 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
30930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
30940 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25  rintf(&x, 0, " %
30950 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
30960 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30970 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
30980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30990 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30  te3XPrintf(&x, 0
309a0 2c 20 22 20 74 61 62 6e 61 6d 65 3d 25 51 22 2c  , " tabname=%Q",
309b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
309c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
309d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
309e0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
309f0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
30a00 26 78 2c 20 30 2c 20 22 20 28 41 53 20 25 73 29  &x, 0, " (AS %s)
30a10 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
30a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30a30 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
30a40 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
30a50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30a60 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
30a70 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
30a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
30a90 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
30aa0 73 68 28 26 78 29 3b 0a 20 20 20 20 20 20 73 71  sh(&x);.      sq
30ab0 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
30ac0 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e 65 2c 20  m(pView, zLine, 
30ad0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
30ae0 31 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 70  1); .      if( p
30af0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
30b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30b10 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70  TreeViewSelect(p
30b20 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e 70 53 65  View, pItem->pSe
30b30 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
30b40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  }.      sqlite3T
30b50 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
30b60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
30b70 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
30b80 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66  pView);.  }.  if
30b90 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
30ba0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30bb0 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 57  ewItem(pView, "W
30bc0 48 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b  HERE", (n--)>0);
30bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30be0 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
30bf0 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  p->pWhere, 0);. 
30c00 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30c10 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
30c20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
30c30 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
30c40 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
30c50 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 47 72  st(pView, p->pGr
30c60 6f 75 70 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20  oupBy, (n--)>0, 
30c70 22 47 52 4f 55 50 42 59 22 29 3b 0a 20 20 7d 0a  "GROUPBY");.  }.
30c80 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
30c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
30ca0 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65  reeViewItem(pVie
30cb0 77 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d  w, "HAVING", (n-
30cc0 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
30cd0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
30ce0 56 69 65 77 2c 20 70 2d 3e 70 48 61 76 69 6e 67  View, p->pHaving
30cf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
30d00 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
30d10 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ew);.  }.  if( p
30d20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
30d30 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30d40 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
30d50 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e   p->pOrderBy, (n
30d60 2d 2d 29 3e 30 2c 20 22 4f 52 44 45 52 42 59 22  --)>0, "ORDERBY"
30d70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
30d80 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
30d90 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
30da0 6d 28 70 56 69 65 77 2c 20 22 4c 49 4d 49 54 22  m(pView, "LIMIT"
30db0 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
30dc0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
30dd0 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c  xpr(pView, p->pL
30de0 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
30df0 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
30e00 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
30e10 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
30e20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30e30 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20  ViewItem(pView, 
30e40 22 4f 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e  "OFFSET", (n--)>
30e50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
30e60 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
30e70 77 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30  w, p->pOffset, 0
30e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
30e90 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
30ea0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
30eb0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 63 6f 6e  Prior ){.    con
30ec0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22  st char *zOp = "
30ed0 55 4e 49 4f 4e 22 3b 0a 20 20 20 20 73 77 69 74  UNION";.    swit
30ee0 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
30ef0 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
30f00 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 55          zOp = "U
30f10 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 62 72 65 61  NION ALL";  brea
30f20 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  k;.      case TK
30f30 5f 49 4e 54 45 52 53 45 43 54 3a 20 20 20 7a 4f  _INTERSECT:   zO
30f40 70 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  p = "INTERSECT";
30f50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
30f60 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
30f70 20 20 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50      zOp = "EXCEP
30f80 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
30f90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30fa0 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
30fb0 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d 2d 29 3e 30  ew, zOp, (n--)>0
30fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
30fd0 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69  eeViewSelect(pVi
30fe0 65 77 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 30  ew, p->pPrior, 0
30ff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31000 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
31020 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
31030 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
31040 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.