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

Artifact d32a3d223c4c0981998d69570fe095d0e563b7f6:


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: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
a210: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
a220: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
a230: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
a240: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
a250: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
a260: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
a270: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
a280: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  owid;.  int nKey
a290: 3b 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74  ;.  int nSortDat
a2a0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
a2b0: 20 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20      /* Trailing 
a2c0: 76 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66  values to read f
a2d0: 72 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  rom sorter */.  
a2e0: 69 6e 74 20 69 3b 0a 23 69 66 64 65 66 20 53 51  int i;.#ifdef SQ
a2f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
a300: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73  AIN_COMMENTS.  s
a310: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
a320: 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d  tem *aOutEx = p-
a330: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64  >pEList->a;.#end
a340: 69 66 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  if..  if( pSort-
a350: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
a360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a370: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
a380: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
a390: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
a3a0: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
a3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a3c0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
a3d0: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
a3e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
a3f0: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
a400: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
a410: 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e    iTab = pSort->
a420: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
a430: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
a440: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
a450: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
a460: 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20   regRowid = 0;. 
a470: 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73     regRow = pDes
a480: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53  t->iSdst;.    nS
a490: 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d  ortData = nColum
a4a0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
a4b0: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
a4c0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a4d0: 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77  rse);.    regRow
a4e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a4f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a500: 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b    nSortData = 1;
a510: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
a520: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
a530: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
a540: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
a550: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
a560: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
a570: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
a580: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a590: 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  m;.    addr = 1 
a5a0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
a5b0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
a5c0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
a5d0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
a5e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a5f0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
a600: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
a610: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
a620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a630: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
a640: 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  , iTab, regSortO
a650: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
a660: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
a670: 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6c 75 6d 6e   OP_SorterColumn
a680: 73 2c 20 6e 4b 65 79 2c 20 6e 53 6f 72 74 44 61  s, nKey, nSortDa
a690: 74 61 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 53  ta, regRow, regS
a6a0: 6f 72 74 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  ortOut);.  }else
a6b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a6d0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a6e0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a6f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a700: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
a710: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
a720: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
a730: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
a740: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
a750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a760: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a770: 75 6d 6e 2c 20 69 54 61 62 2c 20 6e 4b 65 79 2b  umn, iTab, nKey+
a780: 69 2b 31 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a  i+1, regRow+i);.
a790: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
a7a0: 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74  t((v, "%s", aOut
a7b0: 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f  Ex[i].zName ? aO
a7c0: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20  utEx[i].zName : 
a7d0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29  aOutEx[i].zSpan)
a7e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a7f0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
a800: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
a810: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
a820: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
a830: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a840: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
a850: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a860: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
a870: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
a880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a890: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
a8a0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
a8b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a8c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a8d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a8e0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
a8f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a900: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
a910: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
a920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a930: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a940: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
a950: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
a960: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a970: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
a980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a990: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
a9a0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
a9b0: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20   1, regRowid,.  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66        &pDest->af
a9e0: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
a9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
aa00: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
aa10: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
aa20: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
aa30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aa40: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
aa50: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
aa60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa70: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
aa80: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
aa90: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
aaa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
aab0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
aac0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
aad0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
aae0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
aaf0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
ab00: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
ab10: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
ab20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ab30: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
ab40: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
ab50: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
ab60: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
ab70: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
ab80: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
ab90: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
aba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
abb0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
abc0: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
abd0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
abf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ac00: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
ac10: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
ac20: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
ac30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
ac40: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
ac50: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
ac60: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
ac70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ac90: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
aca0: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
acb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
acc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
acd0: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ace0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
acf0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
ad00: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
ad10: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
ad20: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ad30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a   regRowid);.  }.
ad40: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
ad50: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
ad60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
ad70: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
ad80: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69  drContinue);.  i
ad90: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
ada0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
adb0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
adc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
add0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
ade0: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
adf0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ae10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ae20: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
ae30: 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  b, addr); VdbeCo
ae40: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
ae50: 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52   if( pSort->regR
ae60: 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56  eturn ) sqlite3V
ae70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ae80: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72  Return, pSort->r
ae90: 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c  egReturn);.  sql
aea0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
aeb0: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
aec0: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  k);.}../*.** Ret
aed0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
aee0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
aef0: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
af00: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
af10: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
af20: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
af30: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
af40: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
af50: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
af60: 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74   Also try to est
af70: 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f  imate the size o
af80: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
af90: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
afa0: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
afb0: 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a  n *pEstWidth..**
afc0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
afd0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
afe0: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
aff0: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
b000: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
b010: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
b020: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
b030: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b040: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
b050: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
b060: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
b070: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
b080: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
b090: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
b0a0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b0b0: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
b0c0: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
b0d0: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
b0e0: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
b0f0: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
b100: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
b110: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
b120: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
b130: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
b140: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
b150: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
b160: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
b170: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b180: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b190: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b1a0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b1b0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
b1c0: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
b1d0: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
b1e0: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
b1f0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
b200: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
b210: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
b220: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
b230: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  umn is NULL..**.
b240: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b250: 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20  has either 3 or 
b260: 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70  6 parameters dep
b270: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
b280: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
b290: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
b2a0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f  LUMN_METADATA co
b2b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
b2c0: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  n is used..*/.#i
b2d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b2e0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b2f0: 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  TA.# define colu
b300: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b310: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b320: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a  pl(A,B,C,D,E,F).
b330: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b340: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
b350: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
b360: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
b370: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
b380: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
b390: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
b3a0: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
b3b0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
b3c0: 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  ol,.  u8 *pEstWi
b3d0: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
b3e0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
b3f0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
b400: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
b410: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b420: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20  gCol = 0;.#else 
b430: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
b440: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b450: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
b460: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b470: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b480: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b490: 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63  (A,B,F).static c
b4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b4b0: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b4c0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b4d0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
b4e0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
b4f0: 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  {.#endif /* !def
b500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
b510: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b520: 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  TA) */.  char co
b530: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
b540: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
b550: 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69  tWidth = 1;..  i
b560: 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
b570: 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  0) || pNC->pSrcL
b580: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
b590: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
b5a0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
b5b0: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
b5c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
b5d0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
b5e0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b5f0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
b600: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
b610: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
b620: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
b630: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
b640: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
b650: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
b660: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
b670: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
b680: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
b690: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b6a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b6c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
b6d0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
b6e0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
b6f0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b710: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
b720: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
b730: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
b740: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
b750: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
b760: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
b770: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
b780: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b790: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
b7a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b7b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
b7c0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b7d0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
b7e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
b7f0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
b800: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
b810: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
b820: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
b830: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
b840: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
b850: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
b860: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
b870: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
b890: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
b8a0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
b8b0: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
b8c0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
b8d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b8e0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
b8f0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
b900: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
b910: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
b920: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
b930: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
b940: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
b950: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
b960: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
b970: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
b980: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
b990: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
b9a0: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
b9b0: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
b9c0: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
b9d0: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
b9e0: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
b9f0: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
ba00: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
ba10: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
ba20: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
ba30: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
ba40: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
ba50: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
ba60: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
ba70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
ba80: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
ba90: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
baa0: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
bab0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
bac0: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
bad0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bae0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
baf0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bb00: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
bb10: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
bb20: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
bb30: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
bb40: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
bb50: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
bb60: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
bb70: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
bb80: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
bb90: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
bba0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bbb0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
bbc0: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
bbd0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
bbe0: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
bbf0: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
bc00: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
bc10: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
bc20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
bc30: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
bc40: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
bc50: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
bc60: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
bc70: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
bc80: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
bc90: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
bca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bcb0: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
bcc0: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
bcd0: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
bce0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
bcf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
bd00: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
bd10: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
bd20: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
bd30: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
bd40: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
bd50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
bd60: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
bd70: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
bd80: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
bd90: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
bda0: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
bdb0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
bdc0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
bdd0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
bde0: 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
bdf0: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
be00: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
be10: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
be20: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
be30: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
be40: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
be50: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
be60: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
be70: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
be80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
be90: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
bea0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
beb0: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
bec0: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
bed0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
bee0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bef0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
bf00: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
bf10: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
bf20: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
bf30: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
bf40: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
bf50: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
bf60: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
bf70: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
bf80: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
bf90: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
bfa0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
bfb0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
bfc0: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
bfd0: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
bfe0: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  dth); .        }
bff0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c000: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
c010: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
c020: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
c030: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
c040: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c050: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
c060: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
c070: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
c080: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
c090: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
c0a0: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
c0b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c0c0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c0d0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c0e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
c0f0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
c100: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c110: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
c120: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c130: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c140: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c150: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
c160: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
c170: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
c180: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
c190: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c1a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c1b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c1c0: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
c1d0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
c1e0: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
c1f0: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
c200: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c210: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c220: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
c230: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c240: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c250: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
c260: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
c270: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
c280: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
c290: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c2a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
c2b0: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
c2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c2d0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c2e0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c300: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c310: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c320: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
c330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
c350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c360: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
c370: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
c380: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
c390: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
c3a0: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
c3b0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c3c0: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
c3d0: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
c3e0: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
c3f0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
c400: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
c410: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
c420: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
c430: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c440: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
c450: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
c460: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
c470: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c480: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c490: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
c4a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
c4b0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
c4c0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
c4d0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c4e0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
c4f0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c500: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
c510: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
c520: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
c530: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c540: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c550: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c560: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c580: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
c590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c5a0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c5b0: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
c5c0: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
c5d0: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
c5e0: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
c5f0: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
c600: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
c610: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
c620: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
c630: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
c640: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
c650: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
c660: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
c670: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
c680: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c690: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c6a0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
c6b0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c6c0: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
c6d0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
c6e0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
c6f0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
c700: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
c710: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
c720: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
c730: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
c740: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
c750: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
c760: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c770: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
c780: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
c790: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
c7a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
c7b0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
c7c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c7d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
c7e0: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
c7f0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
c800: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
c810: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
c820: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
c830: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
c840: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
c850: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
c860: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
c870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
c880: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
c890: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c8a0: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
c8b0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
c8c0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
c8d0: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
c8e0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
c8f0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
c900: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
c910: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c920: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c930: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c940: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
c950: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
c960: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
c970: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
c980: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
c990: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
c9a0: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
c9b0: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
c9c0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
c9d0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
c9e0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
c9f0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
ca00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ca10: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ca20: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
ca30: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
ca40: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
ca50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ca60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ca70: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
ca80: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
ca90: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
caa0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cab0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
cac0: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
cad0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
cae0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
caf0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
cb00: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
cb10: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
cb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cb30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cb40: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
cb50: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
cb60: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
cb70: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
cb80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
cb90: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
cba0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cbb0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cbc0: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
cbd0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
cbe0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
cbf0: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
cc00: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
cc10: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
cc20: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
cc30: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
cc40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cc50: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
cc60: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cc70: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc80: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cc90: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
cca0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ccb0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ccc0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
ccd0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
cce0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
ccf0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
cd00: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cd10: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
cd20: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
cd30: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cd40: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
cd50: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
cd60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd70: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
cd80: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
cd90: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
cda0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
cdb0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
cdc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cdd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
cde0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
cdf0: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
ce00: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
ce10: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
ce20: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
ce30: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
ce40: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
ce50: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
ce60: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
ce70: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
ce80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
ce90: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
cea0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
ceb0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
cec0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
ced0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
cee0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
cef0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
cf00: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
cf10: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
cf20: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
cf30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
cf40: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
cf50: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
cf60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
cf70: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
cf80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf90: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
cfa0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
cfb0: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
cfc0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
cfd0: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
cfe0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
cff0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
d000: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
d010: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
d020: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
d030: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
d040: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
d050: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
d060: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
d070: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
d080: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d090: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
d0a0: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
d0b0: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
d0c0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
d0d0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
d0e0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
d0f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
d100: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
d110: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
d120: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
d130: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
d140: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
d150: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
d160: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
d170: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d180: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
d190: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
d1a0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d1b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
d1c0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
d1d0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
d1e0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
d1f0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
d200: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d210: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d220: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
d230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
d240: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
d250: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
d260: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d270: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d280: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
d290: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d2a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
d2b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
d2c0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
d2d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
d2e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
d2f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d300: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d310: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d320: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d330: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d350: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d360: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d370: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d380: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
d390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
d3b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d3c0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
d3d0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
d3e0: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
d3f0: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
d400: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
d410: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
d420: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d430: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d440: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
d450: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
d460: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
d470: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
d480: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
d490: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
d4a0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
d4b0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d4c0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d4d0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d4e0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d4f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d500: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d510: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d520: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d530: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d540: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d550: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d560: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d570: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d580: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d590: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d5a0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d5b0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d5c0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d5d0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d5e0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d5f0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d600: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d610: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d620: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d630: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d640: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d650: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d660: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d670: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d680: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d690: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d6a0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d6b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d6c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d6d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d6e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d6f0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d700: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d710: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d720: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d730: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d740: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d750: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d760: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d770: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d780: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d790: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d7a0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d7b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d7c0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d7d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d7e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d7f0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d800: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d810: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d820: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d830: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d840: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
d850: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
d860: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
d870: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
d880: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
d890: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
d8a0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
d8b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d8c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d8d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d8e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d8f0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
d900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d910: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
d920: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
d930: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
d940: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
d950: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
d960: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
d970: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
d980: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d990: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
d9a0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
d9b0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
d9c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
d9d0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
d9e0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
d9f0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
da00: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
da10: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
da20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
da30: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
da40: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
da50: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
da60: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
da70: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
da80: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
da90: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
daa0: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
dab0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
dac0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
dad0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
dae0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
daf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
db00: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
db10: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
db20: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
db30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
db40: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
db50: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
db60: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
db70: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
db80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
db90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dba0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
dbb0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
dbc0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
dbd0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
dbe0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
dbf0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
dc00: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
dc10: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
dc20: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
dc30: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
dc40: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
dc50: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
dc60: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
dc70: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
dc80: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
dc90: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
dca0: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
dcb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dcc0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
dcd0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
dce0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
dcf0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
dd00: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
dd10: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
dd20: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
dd30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
dd40: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
dd50: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
dd60: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
dd70: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
dd80: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
dd90: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
dda0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
ddb0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ddc0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
ddd0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
dde0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
ddf0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
de00: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
de10: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
de20: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
de30: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
de40: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
de50: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
de60: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
de70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
de80: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
de90: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
dea0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
deb0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
dec0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
ded0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
dee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
def0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
df00: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
df10: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
df20: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
df30: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
df40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
df50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
df60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
df70: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
df80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
df90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
dfa0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
dfb0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
dfc0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
dfd0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
dfe0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
dff0: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e000: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e010: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e020: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
e030: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e040: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
e050: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
e060: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
e070: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
e080: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
e090: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
e0a0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
e0b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
e0c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
e0d0: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
e0e0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
e0f0: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
e100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d  .        if( k>=
e110: 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27  0 && zName[k]=='
e120: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
e130: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
e140: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
e150: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
e160: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e170: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
e180: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
e190: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e1a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e1b0: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
e1c0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
e1d0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
e1e0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
e1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e200: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
e210: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
e220: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e230: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
e240: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
e250: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e260: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
e270: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
e280: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e290: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
e2a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
e2b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
e2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e2d0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
e2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e2f0: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
e300: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
e310: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
e320: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
e330: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
e340: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
e350: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
e360: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
e370: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
e380: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
e390: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
e3a0: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
e3b0: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
e3c0: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
e3d0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
e3e0: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
e3f0: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
e400: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e410: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e420: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
e430: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
e440: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
e450: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
e460: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
e470: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
e480: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
e490: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
e4a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e4b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e4c0: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
e4d0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e4e0: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
e4f0: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
e500: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
e510: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e520: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
e530: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
e540: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
e550: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
e560: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e570: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
e580: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e590: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
e5a0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
e5b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
e5c0: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
e5d0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
e5e0: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
e5f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
e600: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
e610: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
e620: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
e630: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
e640: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e650: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
e660: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
e670: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e680: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e690: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
e6a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
e6b0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
e6c0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
e6d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e6e0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
e6f0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
e700: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
e710: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
e720: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e730: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
e740: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
e750: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
e760: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
e770: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
e780: 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73  ,0,0,0, &pCol->s
e790: 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c  zEst));.    szAl
e7a0: 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  l += pCol->szEst
e7b0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
e7c0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
e7d0: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
e7e0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
e7f0: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
e800: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
e810: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
e820: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
e830: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e840: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
e850: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
e860: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
e870: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e880: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
e890: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
e8a0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
e8b0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
e8c0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
e8d0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
e8e0: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
e8f0: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
e900: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
e910: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
e920: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
e930: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
e940: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
e950: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
e960: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
e970: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
e980: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
e990: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e9a0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
e9b0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
e9c0: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
e9d0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
e9e0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
e9f0: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
ea00: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
ea10: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
ea20: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
ea30: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
ea40: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ea50: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
ea60: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
ea70: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
ea80: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
ea90: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
eaa0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
eab0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
eac0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ead0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
eae0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
eaf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
eb00: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
eb10: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
eb20: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
eb30: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
eb40: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
eb50: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
eb60: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
eb70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
eb80: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
eb90: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
eba0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
ebb0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
ebc0: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
ebd0: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
ebe0: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
ebf0: 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75   );.  selectColu
ec00: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
ec10: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
ec20: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
ec30: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
ec40: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
ec50: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
ec60: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
ec70: 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab, pSelect);.  
ec80: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
ec90: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
eca0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ecb0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
ecc0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
ecd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ece0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
ecf0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ed00: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
ed10: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
ed20: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
ed30: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
ed40: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ed50: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
ed60: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
ed70: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
ed80: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
ed90: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
eda0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
edb0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
edc0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
edd0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
ede0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
edf0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
ee00: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
ee10: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
ee20: 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29  dOp0(v, OP_Init)
ee30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
ee40: 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20  ->pToplevel==0. 
ee50: 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
ee60: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
ee70: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
ee80: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20  torOutConst).   
ee90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
eea0: 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
eeb0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  = 1;.    }..  }.
eec0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
eed0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
eee0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
eef0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ef00: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ef10: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ef20: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ef30: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ef40: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ef50: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
ef60: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
ef70: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
ef80: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
ef90: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
efa0: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
efb0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
efc0: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
efd0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
efe0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
eff0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
f000: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
f010: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
f020: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
f030: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
f040: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
f050: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
f060: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
f070: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
f080: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
f090: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
f0a0: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
f0b0: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
f0c0: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
f0d0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f0e0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
f0f0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
f100: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
f110: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
f120: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
f130: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
f140: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
f150: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
f160: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
f170: 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
f180: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
f190: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
f1a0: 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
f1b0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
f1c0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f1d0: 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
f1e0: 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
f1f0: 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
f200: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
f210: 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
f220: 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
f230: 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
f240: 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
f250: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
f260: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
f270: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
f280: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
f290: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
f2a0: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
f2b0: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
f2c0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
f2d0: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
f2e0: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
f2f0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
f300: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
f310: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
f320: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
f330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f340: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
f350: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
f360: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
f370: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
f380: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
f390: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
f3a0: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
f3b0: 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66  t addr1, n;.  if
f3c0: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
f3d0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
f3e0: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
f3f0: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
f400: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
f410: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
f420: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
f430: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
f440: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
f450: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
f460: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
f470: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
f480: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
f490: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
f4a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f4b0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
f4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
f4d0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c  fset==0 || p->pL
f4e0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  imit!=0 );.  if(
f4f0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
f500: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
f510: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
f520: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
f530: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f540: 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72  arse);.    asser
f550: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( v!=0 );.    i
f560: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
f570: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
f580: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
f590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f5a0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f5b0: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
f5c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f5d0: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f5e0: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
f5f0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
f600: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f610: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
f620: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f630: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
f640: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
f650: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
f660: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
f670: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
f680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f690: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f6a0: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
f6b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6d0: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
f6e0: 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
f6f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f700: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f710: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f720: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
f730: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f740: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
f750: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
f760: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f770: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
f780: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
f790: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
f7a0: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
f7b0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
f7c0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
f7d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
f7e0: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
f7f0: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
f800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f810: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f820: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
f830: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
f840: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f850: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
f860: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
f870: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f880: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f890: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
f8a0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
f8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8c0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
f8d0: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
f8e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f900: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f910: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
f920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f930: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f940: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f950: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f960: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
f970: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
f980: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
f990: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f9a0: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
f9b0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f9c0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f9d0: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
f9e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f9f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa10: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
fa20: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
fa30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fa40: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
fa50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
fa60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fa70: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
fa80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
fa90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
faa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
fab0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
fac0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
fad0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
fae0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
faf0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
fb00: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
fb10: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
fb20: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
fb30: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fb40: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
fb50: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fb60: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
fb70: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
fb80: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
fb90: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
fba0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
fbb0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
fbc0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
fbd0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
fbe0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fbf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fc00: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
fc10: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
fc20: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
fc30: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
fc40: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
fc50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fc60: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
fc70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
fc80: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
fc90: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
fca0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
fcb0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
fcc0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
fcd0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
fce0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
fcf0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
fd00: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
fd10: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fd20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
fd30: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
fd40: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
fd50: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
fd60: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
fd70: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
fd80: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
fd90: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
fda0: 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
fdb0: 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
fdc0: 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
fdd0: 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
fde0: 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
fdf0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
fe00: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
fe10: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
fe20: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
fe30: 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
fe40: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
fe50: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
fe60: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
fe70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
fe80: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
fe90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
fea0: 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
feb0: 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
fec0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fed0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
fee0: 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
fef0: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
ff00: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ff10: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
ff20: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
ff30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ff40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
ff50: 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
ff60: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
ff70: 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
ff80: 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
ff90: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
ffa0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ffb0: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
ffc0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
ffd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ffe0: 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
fff0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
10000 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
10010 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
10020 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
10030 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
10040 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
10050 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
10060 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10070 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10080 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
10090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
100a0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
100b0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
100c0 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
100d0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
100e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
100f0 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
10100 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
10110 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
10120 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
10130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10140 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
10150 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
10160 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
10170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
10190 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
101a0 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
101b0 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
101c0 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
101d0 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
101e0 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
101f0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
10200 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
10210 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
10220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10230 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
10240 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
10250 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
10260 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
10270 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
10280 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
10290 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
102a0 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
102b0 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
102c0 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
102d0 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
102e0 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
10310 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
10320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
10350 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
10360 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
10370 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
10380 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
10390 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
103a0 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
103b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
103c0 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
103d0 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
103e0 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
103f0 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  ].isRecursive fl
10400 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
10410 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
10420 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
10430 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
10440 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
10450 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
10460 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
10470 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
10480 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
10490 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
104a0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
104b0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
104c0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
104d0 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
104e0 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
104f0 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
10500 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
10510 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
10520 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
10530 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
10540 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
10550 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
10560 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
10570 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
10580 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
10590 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
105a0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
105b0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
105c0 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
105d0 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
105e0 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
105f0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10600 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
10610 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
10620 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
10630 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
10640 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
10650 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
10660 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
10670 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
10680 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
10690 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
106a0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
106b0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
106c0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
106d0 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
106e0 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
106f0 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
10700 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
10710 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
10720 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
10730 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
10740 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
10750 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
10760 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
10770 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
10780 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
10790 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
107a0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
107b0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
107c0 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
107d0 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
107e0 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
107f0 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
10800 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
10810 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
10820 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
10830 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
10840 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
10850 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
10860 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
10870 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
10880 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
10890 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
108a0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
108b0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
108c0 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
108d0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
108e0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
108f0 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
10900 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
10910 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
10920 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
10930 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
10940 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
10950 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
10960 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
10970 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
10980 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
10990 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
109a0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
109b0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
109c0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
109d0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
109e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
109f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10a00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10a20 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
10a30 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
10a40 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
10a50 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
10a60 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
10a70 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10a80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10a90 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
10aa0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
10ab0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
10ac0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10ad0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
10ae0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
10af0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10b00 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
10b10 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
10b20 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10b30 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
10b40 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
10b50 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
10b60 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
10b70 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
10b80 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
10b90 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
10ba0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
10bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10bc0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
10bd0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
10be0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
10bf0 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
10c00 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
10c10 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
10c20 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
10c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10c40 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
10c50 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
10c60 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
10c70 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10c80 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
10c90 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10ca0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
10cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10cc0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10cd0 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
10ce0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
10cf0 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
10d00 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
10d10 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
10d20 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
10d30 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
10d40 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
10d50 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10d60 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
10d70 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
10d80 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
10d90 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10da0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10dc0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10dd0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
10e00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10e10 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
10e20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
10e30 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10e40 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
10e50 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
10e60 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
10e70 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
10e80 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
10e90 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
10ea0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
10eb0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10ec0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
10ed0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
10ee0 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
10ef0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
10f00 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
10f10 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
10f20 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
10f30 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
10f40 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
10f50 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10f60 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
10f70 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
10f80 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
10f90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10fa0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
10fb0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10fc0 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
10fd0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
10fe0 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
10ff0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
11000 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
11010 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
11020 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
11030 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
11040 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
11050 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
11060 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
11070 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11080 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
11090 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
110a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
110b0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
110c0 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
110d0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
110e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
110f0 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73  c->a[i].isRecurs
11100 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
11110 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
11120 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
11130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11140 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
11150 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
11160 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
11170 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
11180 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
11190 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
111a0 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
111b0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
111c0 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
111d0 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
111e0 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
111f0 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
11200 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
11210 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
11220 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
11230 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
11240 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
11250 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
11260 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
11270 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
11280 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
11290 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
112a0 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
112b0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
112c0 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
112d0 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
112e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
112f0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
11300 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
11310 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
11320 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
11330 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
11340 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
11350 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
11360 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11380 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
11390 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
113a0 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
113b0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
113c0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
113d0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
113e0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
113f0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
11400 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
11410 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11420 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11430 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
11440 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
11470 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11480 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
11490 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
114a0 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
114b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
114d0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
114e0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
114f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11500 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
11510 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
11520 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
11530 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
11540 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11550 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11560 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
11570 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
11580 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
11590 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
115a0 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
115b0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
115c0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
115d0 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
115e0 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
115f0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11600 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
11610 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
11620 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
11630 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
11640 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11650 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
11660 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
11670 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
11680 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
11690 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
116a0 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
116b0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
116c0 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
116d0 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
116e0 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
116f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11700 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
11710 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
11720 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11730 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
11740 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
11750 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
11760 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
11770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11780 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
11790 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
117a0 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
117b0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
117c0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
117d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
117e0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
117f0 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11800 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
11810 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
11820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11830 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
11840 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
11850 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
11860 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11870 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
11880 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
11890 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
118a0 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
118b0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
118c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
118d0 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
118e0 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
118f0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
11900 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
11910 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
11920 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
11930 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
11940 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
11950 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
11960 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
11970 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11980 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67  , OP_IfZero, reg
11990 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
119a0 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  , -1);.    VdbeC
119b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
119c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
119d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
119e0 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
119f0 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
11a00 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
11a10 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
11a20 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
11a30 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
11a40 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
11a50 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
11a60 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
11a70 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d  Queue..  */.  p-
11a80 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
11a90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11aa0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
11ab0 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ue);.  assert( p
11ac0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
11ad0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11ae0 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  tup;..  /* Keep 
11af0 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
11b00 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11b10 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
11b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b30 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11b40 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
11b50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11b60 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
11b70 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
11b80 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
11b90 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11ba0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11bb0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
11bc0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
11bd0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
11be0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11bf0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
11c00 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
11c10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11c20 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
11c30 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
11c40 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
11c50 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
11c60 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
11c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11c80 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11c90 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11ca0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11cb0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
11cc0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
11cd0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11ce0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11cf0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11d00 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11d10 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.);.../*.**
11d20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11d30 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
11d40 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
11d50 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
11d60 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
11d70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
11d80 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
11d90 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
11da0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
11db0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
11dc0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
11dd0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
11de0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
11df0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
11e00 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
11e10 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
11e20 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
11e30 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
11e40 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
11e50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
11e60 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
11e70 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
11e80 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
11e90 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
11ea0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
11eb0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
11ec0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
11ed0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
11ee0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
11ef0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
11f00 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
11f10 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
11f20 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
11f30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
11f40 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
11f50 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
11f60 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
11f70 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
11f80 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
11f90 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
11fa0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
11fb0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
11fc0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
11fd0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
11fe0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
11ff0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
12000 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
12010 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
12020 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
12030 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
12040 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
12050 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
12060 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
12070 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
12080 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12090 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
120a0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
120b0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
120c0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
120d0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
120e0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
120f0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12100 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
12110 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
12120 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
12130 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
12140 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
12150 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
12160 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
12170 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
12180 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12190 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
121a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
121b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
121c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
121d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
121e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
121f0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12200 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12210 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12220 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12230 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12240 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
12250 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
12260 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
12270 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
12280 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
12290 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
122a0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
122b0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
122c0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
122d0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
122e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
122f0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
12300 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
12310 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
12320 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
12330 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
12340 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
12350 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
12360 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
12370 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
12380 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
12390 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
123a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
123b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
123c0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
123d0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
123e0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
123f0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12400 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
12410 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12420 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12430 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12440 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
12450 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
12460 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
12470 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12480 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
12490 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
124a0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
124b0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
124c0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
124d0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
124e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
124f0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12500 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
12510 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
12520 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
12530 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
12540 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
12550 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
12560 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
12570 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
12580 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12590 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
125a0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
125b0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
125c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
125d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
125e0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
125f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
12600 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12610 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12620 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
12630 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
12640 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
12650 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12660 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
12670 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
12680 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12690 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
126a0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
126b0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
126c0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
126d0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
126e0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
126f0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12700 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12710 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
12720 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12730 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12740 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
12750 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
12760 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
12770 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
12780 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
12790 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
127a0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
127b0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
127c0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
127d0 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
127e0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
127f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12800 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12810 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
12820 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
12830 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
12840 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12850 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
12860 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
12870 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
12880 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
12890 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
128a0 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
128b0 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
128c0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
128d0 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
128e0 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
128f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12900 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
12910 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
12920 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
12930 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
12940 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12950 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
12960 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
12970 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12980 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12990 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
129a0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
129b0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
129c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
129d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
129e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
129f0 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
12a00 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
12a10 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e  ".        " do n
12a20 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12a30 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
12a40 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
12a50 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
12a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12a70 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
12a80 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12a90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12aa0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
12ab0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12ac0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
12ad0 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
12ae0 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
12af0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
12b00 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
12b10 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
12b20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
12b30 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
12b40 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
12b50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
12b60 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
12b70 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
12b80 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
12b90 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
12ba0 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
12bb0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12bc0 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
12bd0 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
12be0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
12bf0 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
12c00 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12c10 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
12c20 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
12c30 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
12c40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
12c50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
12c60 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
12c70 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12c80 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12c90 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
12ca0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
12cb0 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
12cc0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
12cd0 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
12ce0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
12cf0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
12d00 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
12d10 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
12d20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12d30 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12d40 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
12d50 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
12d60 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
12d70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12d80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
12d90 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
12da0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12db0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12dc0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
12dd0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
12de0 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
12df0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
12e00 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
12e10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
12e20 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
12e30 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12e40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
12e50 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
12e60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12e70 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
12e80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
12e90 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
12ea0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
12eb0 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
12ec0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
12ed0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
12ee0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
12ef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12f00 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12f10 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
12f20 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
12f30 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
12f40 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
12f50 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
12f60 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
12f70 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
12f80 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
12f90 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
12fa0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
12fb0 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
12fc0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
12fd0 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
12fe0 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
12ff0 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
13000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
13010 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
13020 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
13030 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
13040 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
13050 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
13060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13070 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13080 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
13090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
130a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
130b0 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
130c0 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
130d0 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
130e0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
130f0 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
13100 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
13110 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
13120 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
13130 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
13140 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
13150 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
13160 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
13170 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
13180 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
13190 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
131a0 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
131b0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
131c0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
131d0 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
131e0 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
131f0 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
13200 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13210 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
13220 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
13230 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13240 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
13250 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
13260 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13270 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
13280 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
13290 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
132a0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
132b0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
132c0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
132d0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
132e0 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
132f0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
13300 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
13310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13320 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
13330 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
13340 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
13350 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
13360 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13370 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
13380 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
13390 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
133a0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
133b0 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
133c0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
133d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
133e0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
133f0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
13400 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
13410 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
13420 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
13430 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
13440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
13450 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
13460 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
13470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13480 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13490 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
134a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
134b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
134c0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
134d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
134e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
134f0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
13500 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13510 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
13520 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
13530 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
13540 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
13550 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
13560 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13570 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13580 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
13590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
135a0 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
135b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
135c0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
135d0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
135e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
135f0 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
13600 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
13610 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
13620 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13630 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
13640 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13660 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
13670 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
13680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
13690 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
136a0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
136b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
136c0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
136d0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
136e0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
136f0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13700 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
13710 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
13720 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
13730 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13740 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
13750 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
13760 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
13770 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
13780 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
13790 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
137a0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
137b0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
137c0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
137d0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
137e0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
137f0 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
13800 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
13810 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13820 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
13830 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13850 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13860 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
13870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13890 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
138a0 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
138b0 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
138c0 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
138d0 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
138e0 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
138f0 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
13900 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
13910 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
13920 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
13930 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13940 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
13950 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13960 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13970 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13980 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13990 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
139a0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
139b0 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
139c0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
139d0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
139e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
139f0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13a00 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
13a10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
13a20 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
13a30 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
13a40 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
13a50 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
13a60 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
13a70 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
13a80 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
13a90 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
13aa0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
13ab0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
13ac0 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
13ad0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
13ae0 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
13af0 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
13b00 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
13b10 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
13b20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
13b30 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
13b40 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13b50 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13b70 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13b80 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
13b90 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
13ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
13bb0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
13bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
13bd0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
13be0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
13bf0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
13c00 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
13c10 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
13c20 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
13c30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
13c40 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
13c50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13c60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13c70 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
13c80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13c90 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
13ca0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13cb0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
13cc0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
13cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13ce0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
13cf0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
13d00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13d10 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
13d20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13d30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13d40 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
13d50 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
13d60 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
13d70 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13d90 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13da0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13dc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
13dd0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
13de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13df0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
13e00 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
13e10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13e30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13e40 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
13e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
13e70 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
13e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13e90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13ea0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
13eb0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
13ec0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
13ed0 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
13ee0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13ef0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13f00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
13f10 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
13f20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
13f30 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13f40 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
13f50 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
13f60 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
13f70 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
13f80 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
13f90 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
13fa0 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
13fb0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
13fc0 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
13fd0 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
13fe0 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
13ff0 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
14000 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
14010 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14020 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
14030 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
14040 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
14050 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
14060 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
14070 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
14080 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14090 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
140a0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
140b0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
140c0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
140d0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
140e0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
140f0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14100 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
14110 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
14120 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14130 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
14140 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14150 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
14160 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
14170 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
14180 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
14190 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
141a0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
141b0 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
141c0 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
141d0 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
141e0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
141f0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14200 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14210 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14220 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14230 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
14240 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
14250 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14260 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14270 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
14280 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
14290 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
142a0 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
142b0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
142c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
142d0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
142e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
142f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
14300 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
14310 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14320 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
14330 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14340 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
14350 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14360 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14370 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14380 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14390 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
143a0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
143b0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
143c0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
143d0 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
143e0 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
143f0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14400 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14410 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14420 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14430 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14440 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
14450 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
14460 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14470 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14480 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14490 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
144a0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
144b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
144c0 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
144d0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
144e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
144f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14500 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14510 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
14520 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
14530 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
14540 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14550 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
14560 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
14570 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
14580 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
14590 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
145a0 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
145b0 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
145c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
145d0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
145e0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
145f0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14600 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
14610 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
14620 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
14630 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
14640 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
14650 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
14660 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
14670 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
14680 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
14690 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
146a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
146b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
146c0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
146d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
146e0 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
146f0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14700 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
14710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14730 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
14740 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
14750 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
14760 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14770 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14780 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
14790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
147a0 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
147b0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
147c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
147d0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
147e0 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
147f0 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
14800 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
14810 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14820 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14830 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
14840 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
14850 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
14860 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
14870 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14880 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
14890 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
148a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
148b0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
148c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
148e0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
148f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14900 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14910 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14920 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
14930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14940 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
14950 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
14960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14970 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14980 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
14990 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
149a0 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
149b0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
149c0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
149d0 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
149e0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
149f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14a00 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
14a10 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
14a20 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
14a30 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
14a40 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
14a50 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
14a60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
14a70 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
14a80 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
14a90 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
14aa0 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
14ab0 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14ac0 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
14ad0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
14ae0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
14af0 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
14b00 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
14b10 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
14b20 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
14b30 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
14b40 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
14b50 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
14b60 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
14b70 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
14b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14b90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
14ba0 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
14bb0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14be0 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
14bf0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
14c00 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14c10 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
14c20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
14c30 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
14c40 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
14c50 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
14c60 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
14c70 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
14c80 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
14c90 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
14ca0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
14cb0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
14cc0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
14cd0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
14d00 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
14d10 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
14d20 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
14d30 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
14d40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
14d50 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
14d60 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
14d70 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
14d80 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
14d90 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
14da0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14db0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14dc0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
14dd0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
14de0 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
14df0 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
14e00 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
14e10 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
14e20 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
14e30 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
14e40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
14e50 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
14e60 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
14e70 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
14e80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
14e90 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
14ea0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
14eb0 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
14ec0 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
14ed0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
14ee0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
14ef0 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
14f00 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
14f10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
14f20 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
14f30 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
14f40 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
14f50 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
14f60 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
14f70 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
14f80 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
14f90 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
14fa0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14fb0 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
14fc0 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
14fd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15000 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
15010 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
15020 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15030 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
15040 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
15050 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
15080 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
15090 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
150a0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
150b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
150c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
150d0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
150e0 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
150f0 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
15100 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
15110 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
15120 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
15130 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15140 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
15150 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15160 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15170 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
15180 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
15190 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
151a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
151b0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
151c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
151d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
151e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
151f0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
15200 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
15210 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
15220 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
15230 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
15240 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
15250 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
15260 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
15270 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
15280 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
15290 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
152a0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
152b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
152c0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
152d0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
152e0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
152f0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15300 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
15310 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
15320 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
15330 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
15340 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
15350 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
15360 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
15370 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15380 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
15390 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
153a0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
153b0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
153c0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
153d0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
153e0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
153f0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
15400 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
15410 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
15420 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
15430 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
15440 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
15450 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
15460 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
15470 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
15480 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15490 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
154c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
154d0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
154e0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
154f0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
15500 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15510 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
15520 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
15530 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
15540 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
15550 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
15560 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
15570 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
15580 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
15590 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
155a0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
155b0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
155c0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
155d0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
155e0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
155f0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
15600 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
15610 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
15620 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
15630 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
15640 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
15650 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15660 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
15670 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
15680 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15690 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
156a0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
156b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
156c0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
156d0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
156e0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
156f0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
15700 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
15710 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
15720 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
15730 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
15740 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
15750 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
15760 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15770 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15780 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15790 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
157a0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
157b0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
157e0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
157f0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
15800 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
15810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15820 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
15830 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
15840 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
15850 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
15860 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15870 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
15880 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15890 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
158a0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
158b0 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
158c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
158d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
158e0 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
158f0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
15900 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15910 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
15920 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
15930 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
15940 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
15950 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
15960 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
15970 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
15980 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
15990 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
159a0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
159b0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
159c0 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
159d0 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
159e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
159f0 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
15a00 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
15a10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
15a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15a30 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15a40 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
15a50 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15a60 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
15a70 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
15a80 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
15a90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15aa0 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
15ab0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
15ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ad0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
15ae0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
15af0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
15b00 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
15b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b20 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
15b30 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
15b40 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
15b50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15b60 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
15b70 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
15b80 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15b90 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
15ba0 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
15bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15bc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15bd0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
15be0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15bf0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15c00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15c10 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
15c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15c30 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
15c40 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
15c50 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
15c60 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
15c70 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
15c80 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
15c90 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
15ca0 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
15cb0 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
15cc0 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
15cd0 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
15ce0 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
15cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15d00 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
15d10 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
15d20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
15d30 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  st==1 );.      p
15d40 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
15d50 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15d60 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
15d70 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
15d80 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
15d90 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
15da0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15db0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15dd0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
15de0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
15df0 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
15e00 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
15e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15e20 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15e30 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
15e40 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
15e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
15e70 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
15e80 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
15e90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15ea0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15eb0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
15ec0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
15ed0 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
15ee0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
15ef0 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
15f00 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
15f10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
15f20 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
15f30 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
15f40 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
15f50 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
15f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15f80 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44  r, 1, pDest->iSD
15f90 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
15fa0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
15fb0 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
15fc0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
15fd0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
15fe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
15ff0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16000 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16010 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16020 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16030 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16040 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16050 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16060 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16070 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16080 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16090 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
160a0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
160b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
160c0 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
160d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
160e0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
160f0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16100 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
16110 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
16120 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
16130 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
16140 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
16150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16160 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
16170 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16180 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
16190 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
161a0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
161b0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
161c0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
161d0 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
161e0 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
161f0 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
16200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16210 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
16220 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
16230 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
16240 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
16250 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
16260 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
16270 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
16280 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
16290 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
162a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
162b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
162c0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
162d0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
162e0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53  iSdst, pDest->nS
162f0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
16300 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16310 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
16320 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
16330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16340 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
16350 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
16360 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
16370 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
16380 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
16390 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
163a0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
163b0 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
163c0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
163d0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
163e0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
163f0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
16400 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
16410 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
16420 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
16430 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
16440 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
16450 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
16460 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
16470 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
16480 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
16490 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
164a0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
164b0 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
164c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
164d0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
164e0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
164f0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
16500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16510 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16520 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
16530 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
16540 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16550 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
16560 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
16570 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
16580 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
16590 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
165a0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
165b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
165c0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
165d0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
165e0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
165f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16600 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16610 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
16620 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56  , iBreak, -1); V
16630 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16640 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
16650 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
16660 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
16670 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16680 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
16690 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
166a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
166b0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
166c0 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
166d0 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
166e0 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
166f0 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
16700 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
16710 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
16720 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
16730 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
16740 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
16750 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16760 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
16770 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
16780 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
16790 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
167a0 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
167b0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
167c0 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
167d0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
167e0 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
167f0 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
16800 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
16810 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
16820 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
16830 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
16840 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
16850 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
16860 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
16870 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
16880 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
16890 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
168a0 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
168b0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
168c0 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
168d0 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
168e0 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
168f0 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
16900 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
16910 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
16920 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
16930 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
16940 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
16950 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
16960 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
16970 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
16980 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
16990 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
169a0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
169b0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
169c0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
169d0 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
169e0 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
169f0 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
16a00 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
16a10 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
16a20 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
16a30 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
16a40 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
16a50 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
16a60 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
16a70 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
16a80 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
16a90 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
16aa0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
16ab0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
16ac0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
16ad0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
16ae0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
16af0 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
16b00 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
16b10 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
16b20 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
16b30 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
16b40 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
16b50 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
16b60 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
16b70 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
16b80 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
16b90 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
16ba0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
16bb0 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
16bc0 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
16bd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16be0 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
16bf0 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
16c00 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
16c10 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
16c20 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
16c30 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
16c40 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
16c50 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
16c60 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
16c70 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
16c80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ca0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16cb0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16cc0 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
16cd0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16ce0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16cf0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16d00 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
16d10 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
16d20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16d30 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
16d40 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
16d50 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
16d60 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
16d70 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16d80 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
16d90 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
16da0 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
16db0 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
16dc0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
16dd0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
16de0 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
16df0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
16e00 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
16e10 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
16e20 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
16e30 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
16e40 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
16e50 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
16e60 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
16e70 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
16e80 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
16e90 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
16ea0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16eb0 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
16ec0 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
16ed0 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
16ee0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
16ef0 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
16f00 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
16f10 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
16f20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
16f30 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
16f40 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
16f50 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
16f60 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
16f70 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
16f80 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
16f90 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
16fa0 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
16fb0 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
16fc0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
16fd0 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
16fe0 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
16ff0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
17000 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
17010 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
17020 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
17030 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
17040 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
17050 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
17060 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
17070 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
17080 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
17090 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
170a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
170b0 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
170c0 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
170d0 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
170e0 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
170f0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
17100 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
17110 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
17120 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
17130 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
17140 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
17150 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
17160 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
17170 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
17180 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
17190 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
171a0 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
171b0 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
171c0 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
171d0 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
171e0 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
171f0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
17200 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
17210 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
17220 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
17230 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
17240 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
17250 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
17260 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
17270 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17280 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
17290 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
172a0 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
172b0 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
172c0 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
172d0 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
172e0 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
172f0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
17300 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
17310 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
17320 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
17330 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
17340 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
17350 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
17360 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
17370 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
17380 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
17390 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
173a0 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
173b0 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
173c0 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
173d0 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
173e0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
173f0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
17400 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
17410 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
17420 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
17430 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
17440 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17450 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
17460 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
17470 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
17480 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
17490 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
174a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
174b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
174c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
174d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
174e0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
174f0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
17500 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
17510 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
17520 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
17530 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
17540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17550 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
17560 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
17570 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
17580 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
17590 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
175a0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
175b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
175c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
175d0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
175e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
175f0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
17600 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
17610 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
17620 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
17630 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
17640 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
17650 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
17660 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
17670 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17680 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
17690 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
176a0 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
176b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
176c0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
176d0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
176e0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
176f0 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
17700 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
17710 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
17720 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
17730 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
17740 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
17750 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
17760 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
17770 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17780 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17790 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
177a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
177b0 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
177c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
177d0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
177e0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
177f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
17800 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
17810 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
17820 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
17830 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17840 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
17850 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17860 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
17870 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17880 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
17890 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
178a0 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
178b0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
178c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
178d0 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
178e0 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
178f0 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
17900 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
17910 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
17920 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17930 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
17940 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
17950 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
17960 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
17970 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17980 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
17990 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
179a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
179b0 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
179c0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
179d0 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
179e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
179f0 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
17a00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17a10 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
17a20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
17a30 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
17a40 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
17a50 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
17a60 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
17a70 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
17a80 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
17a90 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
17aa0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
17ab0 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
17ac0 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
17ad0 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
17ae0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17af0 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
17b00 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
17b10 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
17b20 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
17b30 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
17b40 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
17b50 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
17b60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
17b70 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
17b80 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
17b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
17ba0 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
17bb0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
17bc0 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
17bd0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
17be0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
17bf0 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
17c00 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
17c10 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
17c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
17c30 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
17c40 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
17c50 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
17c60 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
17c70 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
17c80 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
17c90 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
17ca0 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
17cb0 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
17cc0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
17cd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
17ce0 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
17cf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
17d00 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17d10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17d20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17d30 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
17d40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17d50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
17d60 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
17d70 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17d80 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
17d90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
17da0 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
17db0 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
17dc0 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
17dd0 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
17de0 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
17df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
17e00 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
17e10 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
17e20 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
17e30 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
17e40 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
17e50 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
17e60 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
17e70 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
17e80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17e90 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
17ea0 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
17eb0 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
17ec0 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
17ed0 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
17ee0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
17ef0 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
17f00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
17f10 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
17f20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
17f30 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
17f40 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
17f50 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
17f60 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
17f70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
17f80 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
17f90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17fa0 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
17fb0 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
17fc0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
17fd0 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
17fe0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
17ff0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
18000 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
18010 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
18020 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18030 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
18040 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
18050 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
18060 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
18070 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
18080 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
18090 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
180a0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
180b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
180c0 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
180d0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
180e0 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
180f0 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
18100 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
18110 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
18120 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
18130 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
18140 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18150 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
18160 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18170 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
18180 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
18190 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
181a0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
181b0 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
181c0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
181d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
181e0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
181f0 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
18200 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
18210 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
18220 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
18230 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
18240 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
18250 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
18260 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
18270 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
18280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
18290 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
182a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
182b0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
182c0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
182d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
182e0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
182f0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
18300 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
18310 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
18320 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
18330 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
18340 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
18350 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
18360 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
18370 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
18380 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
18390 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
183a0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
183b0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
183c0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
183d0 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
183e0 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
183f0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
18400 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
18410 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
18420 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
18430 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
18440 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
18450 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
18460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18470 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
18480 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
18490 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
184a0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
184b0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
184c0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
184d0 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
184e0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
184f0 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
18500 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
18510 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
18520 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
18530 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
18540 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
18550 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
18560 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
18570 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
18580 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
18590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
185a0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
185b0 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20  erByCol>0.      
185c0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e      && pItem->u.
185d0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
185e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
185f0 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
18600 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
18610 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
18620 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
18630 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
18640 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
18650 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
18660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18670 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
18680 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
18690 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
186a0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
186b0 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
186c0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
186d0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
186e0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
186f0 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
18700 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
18710 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
18720 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
18730 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
18740 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
18750 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
18760 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
18770 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
18780 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
18790 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
187a0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
187b0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
187c0 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
187d0 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
187e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
187f0 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
18800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18810 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
18820 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
18830 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
18840 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
18850 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18860 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
18870 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18880 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18890 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
188a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
188b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
188c0 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
188d0 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
188e0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
188f0 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
18900 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
18910 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18920 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
18930 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
18940 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
18950 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
18960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
18970 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
18980 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
18990 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
189a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
189b0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
189c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
189d0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
189e0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
189f0 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
18a00 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
18a10 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
18a20 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
18a30 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
18a40 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
18a50 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
18a60 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
18a70 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
18a80 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
18a90 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
18aa0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18ab0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18ac0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
18ad0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
18ae0 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
18af0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
18b00 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
18b10 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
18b20 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
18b30 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
18b40 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
18b50 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
18b60 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
18b70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18b80 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
18b90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18bb0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18bc0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
18bd0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
18be0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
18c10 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
18c20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18c30 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
18c40 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
18c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
18c60 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
18c70 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
18c80 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
18c90 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
18ca0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18cb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18cc0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
18cd0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
18ce0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
18cf0 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
18d00 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
18d10 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
18d20 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
18d30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18d40 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
18d50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
18d60 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
18d70 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
18d80 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18d90 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
18da0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
18db0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
18dc0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
18dd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
18de0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
18df0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
18e00 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
18e10 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
18e20 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
18e30 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
18e40 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
18e50 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
18e60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18e70 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d  r(v) + 1;.  j1 =
18e80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18e90 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
18ea0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18eb0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
18ec0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
18ed0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
18ee0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
18ef0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
18f00 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
18f10 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
18f20 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
18f30 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
18f40 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18f50 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
18f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f70 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
18f80 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18f90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18fa0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
18fb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18fc0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
18fd0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
18fe0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
18ff0 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
19000 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
19010 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
19020 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
19030 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
19040 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69  + 1;.  j1 = sqli
19050 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19060 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19070 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
19080 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
19090 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
190a0 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
190b0 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
190c0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
190d0 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
190e0 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
190f0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
19100 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
19110 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
19120 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
19130 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
19140 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
19150 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
19160 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
19170 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
19180 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
19190 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
191a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
191b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
191c0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
191d0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
191e0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
191f0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
19200 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
19210 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
19220 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
19230 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
19240 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19250 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
19260 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19270 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19280 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
19290 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
192a0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
192b0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
192c0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
192d0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
192e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192f0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19300 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19310 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
19320 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19330 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
19340 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
19350 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
19360 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19370 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19380 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
19390 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
193a0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
193b0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
193c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
193d0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
193e0 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
193f0 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
19400 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
19410 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
19420 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
19430 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
19440 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
19450 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
19460 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
19470 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19480 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
19490 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
194a0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
194b0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
194c0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
194d0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
194e0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
194f0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
19500 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
19510 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19520 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
19530 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
19540 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
19550 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
19560 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
19570 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
19580 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
19590 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
195a0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
195b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
195c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
195d0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
195e0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
195f0 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
19600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19610 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
19620 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
19650 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19670 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19680 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
19690 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
196a0 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
196b0 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
196c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
196d0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
196e0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
196f0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
19700 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
19710 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
19720 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
19730 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
19740 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
19750 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
19760 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
19770 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
19780 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
19790 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
197a0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
197b0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
197c0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
197d0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
197e0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
197f0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
19800 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
19810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
19820 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
19830 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
19840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19850 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19860 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
19870 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
198a0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
198b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
198c0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
198d0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
198e0 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
198f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
19900 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
19910 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
19920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19930 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19940 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
19950 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
19960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19970 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19980 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
19990 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
199a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
199b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
199c0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
199d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
199e0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
199f0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
19a00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19a10 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
19a20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
19a30 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
19a40 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19a50 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
19a60 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
19a70 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
19a80 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19a90 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
19aa0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19ab0 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
19ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ad0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19ae0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19af0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
19b00 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19b20 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
19b30 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
19b40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19b50 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19b60 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
19b70 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19b80 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
19b90 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
19ba0 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
19bb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19bc0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
19bd0 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
19be0 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
19bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19c00 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
19c10 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
19c20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19c30 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19c40 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
19c50 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
19c60 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
19c70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19c80 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19c90 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
19ca0 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
19cb0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
19cc0 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
19cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19ce0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
19cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d00 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19d10 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19d20 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
19d30 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
19d40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19d50 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19d60 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
19d70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19d80 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
19d90 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
19da0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
19db0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19dc0 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
19dd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19de0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
19df0 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
19e00 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
19e10 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
19e20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19e30 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
19e40 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
19e50 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
19e60 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
19e90 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
19ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19eb0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ec0 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
19ed0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19ee0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
19ef0 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
19f00 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
19f10 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
19f20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
19f30 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
19f40 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
19f50 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
19f60 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19f70 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
19f80 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
19f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
19fa0 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
19fb0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
19fc0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
19fd0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
19fe0 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
19ff0 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
1a000 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
1a010 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
1a020 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
1a030 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1a040 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
1a050 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1a060 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1a070 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1a080 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1a090 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1a0a0 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1a0b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a0c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1a0d0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1a0e0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1a0f0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1a100 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1a110 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1a120 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1a130 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1a140 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1a150 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1a160 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1a170 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1a180 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
1a190 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
1a1a0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
1a1b0 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
1a1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a1d0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
1a1e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a1f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1a200 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1a210 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1a220 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1a230 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1a240 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1a250 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
1a260 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
1a270 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
1a280 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1a290 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
1a2a0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
1a2b0 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
1a2c0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
1a2d0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
1a2e0 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
1a2f0 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
1a300 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
1a310 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
1a320 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1a330 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
1a340 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
1a350 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
1a360 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1a370 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
1a380 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
1a390 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a3a0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
1a3b0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
1a3c0 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
1a3d0 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
1a3e0 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
1a3f0 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
1a400 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
1a410 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
1a420 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
1a430 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
1a440 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
1a450 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
1a460 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
1a470 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
1a480 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
1a490 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1a4a0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1a4b0 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1a4c0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1a4d0 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1a4e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a4f0 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1a500 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1a510 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1a520 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1a530 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1a550 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1a560 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
1a570 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1a580 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
1a590 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1a5a0 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1a5b0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1a5c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
1a5d0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1a5e0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1a5f0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
1a600 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
1a610 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
1a620 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1a630 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a640 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a650 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1a660 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
1a670 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a680 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1a690 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1a6a0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
1a6b0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
1a6c0 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
1a6d0 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
1a6e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
1a6f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1a710 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
1a720 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
1a730 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
1a740 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a750 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
1a760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1a770 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
1a780 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1a790 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1a7a0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1a7b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a7c0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1a7d0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a7e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
1a7f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a800 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1a810 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1a820 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1a830 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a840 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
1a850 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a860 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1a870 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1a880 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
1a890 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
1a8a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a8b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1a8c0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1a8d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1a8e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a8f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a900 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1a910 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1a920 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1a930 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1a940 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1a950 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1a960 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1a970 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1a980 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1a990 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1a9a0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1a9b0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1a9c0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1a9d0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1a9e0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1a9f0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1aa00 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1aa10 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1aa20 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1aa30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1aa40 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1aa50 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1aa60 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1aa70 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1aa80 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1aa90 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1aaa0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1aab0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1aac0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1aad0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1aae0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1aaf0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1ab00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1ab10 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1ab20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1ab30 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1ab40 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1ab50 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1ab60 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1ab70 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1ab80 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1ab90 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1aba0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1abb0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1abc0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1abd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1abe0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1abf0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ac00 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1ac10 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ac20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ac30 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
1ac40 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1ac50 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ac60 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1ac70 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ac80 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
1ac90 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1aca0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1acb0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
1acc0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1acd0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
1ace0 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
1acf0 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
1ad00 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
1ad10 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ad20 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1ad30 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1ad40 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
1ad50 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
1ad60 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
1ad70 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
1ad80 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
1ad90 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
1ada0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1adb0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1adc0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1add0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1ade0 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
1adf0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1ae00 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1ae10 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1ae20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ae30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1ae40 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1ae50 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1ae60 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ae70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ae80 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1ae90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1aea0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1aeb0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1aec0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1aed0 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1aee0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1aef0 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1af00 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1af10 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1af20 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1af30 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1af40 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1af50 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1af60 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1af70 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1af80 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1af90 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1afa0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1afb0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1afc0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1afd0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1afe0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1aff0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1b000 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1b010 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1b020 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1b030 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1b040 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1b050 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1b060 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1b070 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1b080 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1b090 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1b0a0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1b0b0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1b0c0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1b0d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1b0e0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1b0f0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1b100 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1b110 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1b120 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1b130 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1b140 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1b150 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1b160 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1b170 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1b180 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1b190 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1b1a0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1b1b0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b1c0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1b1d0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1b1e0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1b1f0 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1b200 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1b210 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1b220 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1b230 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1b240 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1b250 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1b260 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1b270 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1b280 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1b290 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1b2a0 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1b2b0 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1b2c0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1b2d0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1b2e0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1b2f0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1b300 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1b310 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1b320 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1b330 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1b340 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1b350 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1b360 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
1b370 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1b380 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1b390 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1b3a0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1b3b0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1b3c0 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1b3d0 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1b3e0 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1b3f0 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1b400 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1b410 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1b420 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1b430 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1b440 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1b450 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1b460 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1b470 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1b480 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1b490 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1b4a0 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1b4b0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1b4c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1b4d0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1b4e0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1b4f0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1b500 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1b510 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1b520 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1b530 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b540 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1b550 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1b560 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1b570 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1b580 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1b590 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1b5a0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1b5b0 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1b5c0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1b5d0 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1b5e0 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1b5f0 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1b600 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1b610 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1b620 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1b630 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1b640 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1b650 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1b660 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1b670 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1b680 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b690 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1b6a0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1b6b0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1b6c0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1b6d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b6e0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1b6f0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b700 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b710 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1b720 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1b730 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1b740 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1b750 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1b760 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1b770 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1b780 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1b790 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1b7a0 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1b7b0 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1b7c0 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a  .**        text:
1b7d0 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64   "The subquery d
1b7e0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1b7f0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1b800 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1b810 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
1b820 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1b830 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1b840 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1b850 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b860 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1b870 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1b880 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1b890 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1b8a0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1b8b0 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1b8c0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1b8d0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1b8e0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1b8f0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1b900 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1b910 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1b920 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1b930 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1b940 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1b950 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b960 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1b970 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1b980 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1b990 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1b9a0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1b9b0 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1b9c0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1b9d0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1b9e0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1b9f0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1ba00 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1ba10 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1ba20 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1ba30 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1ba40 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1ba50 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1ba60 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1ba70 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1ba80 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1ba90 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1baa0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1bab0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1bac0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1bad0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1bae0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1baf0 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1bb00 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1bb10 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1bb20 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1bb30 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1bb40 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1bb50 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1bb60 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1bb70 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1bb80 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1bb90 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1bba0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1bbb0 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1bbc0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1bbd0 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1bbe0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1bbf0 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1bc00 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1bc10 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1bc20 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1bc30 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1bc40 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1bc50 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1bc60 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1bc70 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1bc80 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1bc90 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1bca0 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1bcb0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1bcc0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1bcd0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1bce0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1bcf0 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1bd00 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1bd10 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1bd20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1bd30 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1bd40 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1bd50 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1bd60 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1bd70 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1bd80 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1bd90 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1bda0 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1bdb0 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1bdc0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1bdd0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1bde0 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1bdf0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1be00 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1be10 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1be20 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1be30 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1be40 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1be50 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1be60 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1be70 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1be80 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1be90 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1bea0 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1beb0 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1bec0 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1bed0 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1bee0 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1bef0 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1bf00 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1bf10 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1bf20 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1bf30 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1bf40 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1bf50 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1bf60 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1bf70 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1bf80 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1bf90 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1bfa0 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1bfb0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1bfc0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1bfd0 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1bfe0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1bff0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c000 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c010 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1c020 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1c030 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1c040 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1c050 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1c060 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1c070 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1c080 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1c090 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1c0a0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1c0b0 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1c0c0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1c0d0 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1c0e0 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1c0f0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1c100 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1c110 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1c120 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1c130 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1c140 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1c150 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1c160 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1c170 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1c180 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1c190 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1c1a0 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1c1b0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c1c0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c1d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c1e0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1c1f0 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1c200 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1c210 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1c220 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1c230 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1c240 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1c250 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1c260 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1c270 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1c280 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1c290 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1c2a0 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1c2b0 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1c2c0 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1c2d0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1c2e0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1c2f0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1c300 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1c310 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1c320 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1c330 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1c340 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
1c350 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75   (24)  The subqu
1c360 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1c370 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
1c380 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
1c390 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
1c3a0 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
1c3b0 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
1c3c0 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1c3d0 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
1c3e0 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
1c3f0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
1c400 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
1c410 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
1c420 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
1c430 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
1c440 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
1c450 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
1c460 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  .).**.**.** In t
1c470 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1c480 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1c490 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1c4a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1c4b0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1c4c0 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1c4d0 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1c4e0 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1c4f0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1c500 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1c510 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1c520 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1c530 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1c540 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1c550 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1c560 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1c570 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c580 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1c590 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1c5a0 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1c5b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1c5c0 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1c5d0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1c5e0 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1c5f0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1c600 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c610 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1c620 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1c630 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1c640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1c650 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1c660 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c670 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1c680 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1c690 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1c6a0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1c6b0 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1c6c0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1c6d0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1c6e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1c6f0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1c700 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1c710 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1c720 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1c730 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1c740 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1c750 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1c760 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1c770 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1c780 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1c790 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1c7a0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1c7b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1c7c0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1c7d0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1c7e0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1c7f0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
1c800 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1c810 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1c820 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1c830 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1c840 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1c850 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1c860 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1c870 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1c880 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1c890 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1c8a0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1c8b0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1c8c0 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1c8d0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1c8e0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1c8f0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
1c900 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
1c910 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
1c920 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1c930 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
1c940 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
1c950 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1c960 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
1c970 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
1c980 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1c9b0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1c9e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1c9f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ca00 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1ca10 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1ca20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ca30 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1ca40 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ca50 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1ca60 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1ca70 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1ca80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1ca90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1caa0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1cab0 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1cac0 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1cad0 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1cae0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1caf0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1cb00 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1cb10 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1cb20 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1cb30 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1cb40 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1cb50 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1cb60 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1cb70 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1cb80 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1cb90 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1cba0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1cbb0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1cbc0 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1cbd0 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
1cbe0 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
1cbf0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1cc00 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cc10 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
1cc20 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1cc30 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
1cc40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cc50 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cc60 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
1cc70 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1cc80 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1cc90 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1cca0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1ccb0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1ccc0 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1ccd0 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1cce0 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1ccf0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1cd00 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1cd10 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1cd20 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1cd30 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1cd40 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1cd50 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1cd60 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1cd70 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1cd80 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1cd90 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1cda0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1cdb0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1cdc0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1cdd0 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1cde0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cdf0 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1ce00 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce20 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1ce30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1ce40 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1ce50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce70 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1ce80 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1ce90 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1cea0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1ceb0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1cec0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cf00 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1cf10 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1cf20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1cf30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cf50 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1cf60 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1cf70 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1cf80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1cf90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cfa0 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1cfb0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1cfc0 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1cfd0 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1cfe0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1cff0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d000 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1d010 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1d020 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1d030 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1d040 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d050 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d060 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d070 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1d080 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1d090 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1d0a0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1d0b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d0f0 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1d100 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1d110 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1d120 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1d130 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d140 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1d150 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1d160 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1d170 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d180 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d190 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1d1a0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1d1b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1d1c0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1d1d0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1d1e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1d1f0 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1d200 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1d210 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1d220 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1d230 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1d240 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1d250 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1d260 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1d270 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1d280 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1d290 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d2a0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1d2b0 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1d2c0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1d2d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d2e0 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1d2f0 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1d300 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1d310 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1d320 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1d330 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1d340 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1d350 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1d360 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1d370 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1d380 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1d390 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1d3a0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d3b0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1d3c0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1d3d0 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1d3e0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1d3f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1d400 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d410 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1d420 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1d430 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1d440 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1d450 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1d460 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1d470 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1d480 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1d490 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1d4a0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1d4b0 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1d4c0 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1d4d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1d4e0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d4f0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1d500 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1d510 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1d520 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d530 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1d540 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1d550 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1d560 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1d570 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1d580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1d590 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d5a0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1d5b0 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1d5c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1d5d0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1d5e0 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1d5f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1d600 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1d610 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1d620 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1d630 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1d640 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1d650 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1d660 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1d670 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1d680 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1d690 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1d6a0 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1d6b0 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1d6c0 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1d6d0 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1d6e0 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1d6f0 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1d700 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1d710 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1d720 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1d730 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1d740 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1d750 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1d760 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1d770 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1d780 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1d790 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1d7a0 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1d7b0 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1d7c0 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
1d7d0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1d7e0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1d7f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1d800 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1d810 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1d820 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1d830 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1d840 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1d850 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1d860 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1d870 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1d880 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1d890 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1d8a0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1d8b0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1d8c0 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1d8d0 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1d8e0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1d8f0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1d900 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1d910 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1d920 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1d930 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1d940 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1d950 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1d960 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1d970 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1d980 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1d990 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1d9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d9b0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1d9c0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1d9d0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1d9e0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1d9f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1da00 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1da10 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1da20 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1da30 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1da40 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1da50 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1da60 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1da70 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1da80 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1da90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1daa0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1dab0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1dac0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1dad0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
1dae0 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1daf0 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1db00 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
1db10 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1db20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
1db30 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1db40 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1db50 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
1db60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1db70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1db80 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1db90 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1dba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1dbb0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1dbc0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1dbd0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1dbe0 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1dbf0 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1dc00 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1dc10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1dc20 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1dc30 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1dc40 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1dc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dc60 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1dc70 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1dc80 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1dc90 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1dca0 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41  ***/.  SELECTTRA
1dcb0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
1dcc0 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72  flatten %s.%p fr
1dcd0 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20  om term %d\n",. 
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65    pSub->zSelName
1dd00 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
1dd10 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1dd20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1dd30 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1dd40 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1dd50 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1dd60 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1dd70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1dd80 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1dd90 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1dda0 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1ddb0 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1ddc0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1ddd0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1dde0 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1ddf0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1de00 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1de10 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1de20 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1de30 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1de40 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1de50 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1de60 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1de70 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1de80 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1de90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1dea0 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1deb0 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1dec0 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1ded0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1dee0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1def0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1df00 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1df10 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1df20 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1df30 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1df40 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1df50 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1df60 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1df70 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1df80 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1df90 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1dfa0 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1dfb0 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1dfc0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1dfd0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1dfe0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1dff0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1e000 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1e010 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1e020 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1e030 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1e040 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1e050 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1e060 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1e070 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1e080 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1e090 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1e0a0 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1e0b0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1e0c0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1e0d0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1e0e0 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1e0f0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1e100 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1e110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1e120 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1e130 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1e140 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1e150 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1e160 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1e170 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1e180 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1e190 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1e1a0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1e1b0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1e1c0 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1e1d0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1e1e0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1e1f0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1e200 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1e210 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1e220 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1e230 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1e240 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1e250 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1e260 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1e270 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1e280 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1e290 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e2a0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1e2b0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1e2c0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1e2d0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1e2e0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1e2f0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1e300 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1e310 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1e320 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1e330 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1e340 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1e350 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1e360 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e370 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1e380 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , p, 0);.    sql
1e390 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
1e3a0 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53  e(pNew, pSub->zS
1e3b0 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  elName);.    p->
1e3c0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1e3d0 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1e3e0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1e3f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1e400 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1e410 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1e420 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1e430 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e440 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1e450 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1e460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1e470 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1e480 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1e490 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1e4a0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1e4b0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1e4c0 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1e4d0 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1e4e0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c    SELECTTRACE(2,
1e4f0 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
1e500 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75     ("compound-su
1e510 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
1e520 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61   creates %s.%p a
1e530 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20  s peer\n",.     
1e540 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61      pNew->zSelNa
1e550 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
1e560 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1e570 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e580 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1e590 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1e5a0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1e5b0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1e5c0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1e5d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e5e0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1e5f0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1e600 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1e610 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1e620 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1e630 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1e640 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1e650 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1e660 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e670 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1e680 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1e690 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e6a0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1e6b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e6c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1e6d0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1e6e0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1e6f0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1e700 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e710 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1e720 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1e730 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1e740 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1e750 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1e760 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e770 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1e780 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1e790 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1e7a0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1e7b0 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1e7c0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1e7d0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1e7e0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1e7f0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1e800 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1e810 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1e820 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1e830 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1e840 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1e850 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1e860 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1e870 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1e880 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1e890 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1e8a0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1e8b0 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1e8c0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1e8d0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1e8e0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1e8f0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1e900 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1e910 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1e920 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1e930 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1e940 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1e950 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1e960 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1e970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e980 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1e990 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1e9a0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1e9b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1e9c0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1e9d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1e9e0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1e9f0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1ea00 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1ea10 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1ea20 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1ea30 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1ea40 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1ea50 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1ea60 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1ea70 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1ea80 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1ea90 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1eaa0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1eab0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1eac0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1ead0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1eae0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1eaf0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1eb00 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1eb10 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1eb20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1eb30 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1eb40 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1eb50 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1eb60 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1eb70 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1eb80 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1eb90 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1eba0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1ebb0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1ebc0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1ebd0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1ebe0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1ebf0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1ec00 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1ec10 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1ec20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1ec30 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1ec40 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1ec50 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1ec60 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1ec70 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1ec80 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1ec90 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1eca0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1ecb0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1ecc0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ecd0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1ece0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1ecf0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1ed00 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1ed10 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ed20 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1ed30 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1ed40 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1ed50 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1ed60 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1ed70 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1ed80 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1ed90 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1eda0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1edb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1edc0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1edd0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1ede0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1edf0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1ee00 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1ee10 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1ee20 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1ee30 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1ee40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ee50 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1ee60 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1ee70 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1ee80 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1ee90 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1eea0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1eeb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1eec0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1eed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1eee0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1eef0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1ef00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1ef10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ef20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ef30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1ef40 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1ef50 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1ef60 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1ef70 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1ef80 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ef90 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1efa0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1efb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1efc0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1efd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1efe0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1eff0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1f000 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1f010 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1f020 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1f030 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1f040 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1f050 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1f060 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1f070 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1f080 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1f090 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1f0a0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1f0b0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1f0c0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1f0d0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1f0e0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1f0f0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1f100 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1f110 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1f120 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1f130 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1f140 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1f150 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1f160 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1f170 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1f180 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1f190 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1f1a0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1f1b0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1f1c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f1d0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1f1e0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1f1f0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1f200 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1f210 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1f220 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1f230 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1f240 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1f250 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f260 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1f270 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f280 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1f290 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1f2a0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1f2b0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1f2c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1f2d0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1f2e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1f2f0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1f300 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1f310 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1f320 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1f330 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1f340 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1f350 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1f360 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1f370 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1f380 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1f390 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1f3a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1f3b0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1f3c0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1f3d0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1f3e0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1f3f0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1f400 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1f410 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1f420 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1f430 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f440 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1f450 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f460 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1f470 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1f480 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1f490 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1f4a0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1f4b0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1f4d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1f4e0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1f4f0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1f500 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1f510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1f520 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1f530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f540 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1f550 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1f560 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1f570 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1f580 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1f590 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1f5a0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1f5b0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1f5c0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1f5d0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1f5e0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1f5f0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1f600 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1f610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f620 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1f630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1f640 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1f650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1f660 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1f670 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1f680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1f690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f6a0 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1f6b0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1f6c0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1f6d0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1f6e0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1f6f0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1f700 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1f710 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f720 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1f730 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1f740 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1f750 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1f760 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f770 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f780 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1f790 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1f7a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1f7b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f7c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f7d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1f7e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
1f7f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
1f800 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
1f810 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
1f820 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f830 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
1f840 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
1f850 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
1f860 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
1f870 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
1f880 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
1f890 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
1f8a0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
1f8b0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
1f8c0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
1f8d0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
1f8e0 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
1f8f0 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
1f900 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
1f910 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
1f920 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
1f930 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
1f940 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
1f950 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
1f960 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
1f970 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
1f980 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
1f990 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
1f9a0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
1f9b0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1f9c0 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
1f9d0 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
1f9e0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
1f9f0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
1fa00 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
1fa10 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1fa20 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
1fa30 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
1fa40 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
1fa50 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
1fa60 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
1fa70 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1fa80 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
1fa90 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1faa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
1fab0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
1fac0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
1fad0 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
1fae0 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
1faf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fb00 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1fb10 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1fb20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1fb30 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
1fb40 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
1fb50 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1fb60 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1fb70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1fb80 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1fb90 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1fba0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1fbb0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1fbc0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1fbd0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1fbe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1fbf0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1fc00 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1fc10 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1fc20 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1fc30 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1fc40 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1fc50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fc60 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1fc70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fc80 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1fc90 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1fca0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1fcb0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1fcc0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1fcd0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1fce0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1fcf0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1fd00 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1fd10 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1fd20 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1fd30 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1fd40 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1fd50 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1fd60 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1fda0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1fdb0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1fdc0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1fdd0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1fde0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1fdf0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1fe00 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1fe10 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1fe20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1fe30 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1fe40 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1fe50 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1fe60 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1fe70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1fe80 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1fe90 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1fea0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1feb0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1fec0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1fed0 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1fee0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1fef0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1ff00 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1ff10 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1ff20 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1ff30 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1ff40 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1ff50 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ff60 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1ff70 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1ff80 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1ff90 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1ffa0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1ffb0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1ffc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1ffd0 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1ffe0 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1fff0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20000 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
20010 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
20020 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
20030 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
20040 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
20050 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
20060 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20070 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
20080 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
20090 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
200a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
200b0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
200c0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
200d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
200e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
200f0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
20100 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
20110 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
20120 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
20130 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
20140 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
20150 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
20160 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20170 74 66 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  tf("After flatte
20180 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73  ning:\n");.    s
20190 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
201a0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
201b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
201c0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
201d0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
201e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
201f0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
20200 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
20210 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
20220 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
20230 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
20240 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
20250 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
20260 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
20270 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
20280 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
20290 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
202a0 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
202b0 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
202c0 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
202d0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
202e0 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
202f0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
20300 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
20310 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
20320 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
20330 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
20340 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
20350 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
20360 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
20370 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
20380 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
20390 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
203a0 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
203b0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
203c0 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
203d0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
203e0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
203f0 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
20400 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
20410 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
20420 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
20430 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
20440 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
20450 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
20460 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
20470 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
20480 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
20490 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
204a0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
204b0 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
204c0 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
204d0 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
204e0 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
204f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
20500 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
20510 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
20520 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
20530 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
20540 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
20550 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
20560 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20570 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
20580 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
20590 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
205a0 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
205b0 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
205c0 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
205d0 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
205e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
205f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
20600 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
20610 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
20620 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
20630 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
20640 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
20650 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
20660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
20670 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
20680 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
20690 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
206a0 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
206b0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
206c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
206d0 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
206e0 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
206f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20700 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
20710 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
20720 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
20730 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
20740 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
20750 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
20760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20770 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
20780 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
20790 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
207a0 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
207b0 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
207c0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
207d0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
207e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
207f0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
20800 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20810 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
20820 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
20830 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
20840 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
20850 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
20860 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
20870 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
20880 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
20890 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
208a0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
208b0 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
208c0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
208d0 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
208e0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
208f0 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
20900 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
20910 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20920 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
20930 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
20940 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
20950 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
20960 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
20970 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
20980 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
20990 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
209a0 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
209b0 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
209c0 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
209d0 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
209e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
209f0 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
20a00 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
20a10 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
20a20 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
20a30 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
20a40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20a50 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
20a60 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
20a70 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
20a80 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
20a90 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
20aa0 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
20ab0 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
20ac0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
20ad0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
20ae0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
20af0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
20b00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
20b10 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
20b20 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
20b30 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
20b40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
20b50 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
20b60 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
20b70 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
20b80 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
20b90 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
20ba0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
20bb0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
20bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
20bd0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
20be0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
20bf0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
20c00 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
20c10 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
20c20 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
20c30 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
20c40 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
20c50 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
20c60 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
20c70 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
20c80 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
20c90 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
20ca0 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
20cb0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
20cc0 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
20cd0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
20ce0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
20cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
20d00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
20d10 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
20d20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
20d30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20d40 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
20d50 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
20d60 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
20d70 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
20d80 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
20d90 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
20da0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
20db0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
20dc0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
20dd0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
20de0 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
20df0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
20e00 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
20e10 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
20e20 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
20e30 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
20e40 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
20e50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20e60 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
20e70 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
20e80 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
20e90 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
20ea0 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
20eb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20ec0 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
20ed0 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
20ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20ef0 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
20f00 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
20f10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
20f20 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
20f30 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
20f40 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
20f50 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
20f60 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
20f70 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
20f80 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
20f90 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
20fa0 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
20fb0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
20fc0 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
20fd0 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
20fe0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
20ff0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
21000 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
21010 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
21020 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
21030 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
21040 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
21050 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
21060 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
21070 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
21080 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
21090 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
210a0 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
210b0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
210c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
210d0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
210e0 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
210f0 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
21100 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
21110 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
21120 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
21130 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
21140 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
21150 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
21160 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
21170 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
21180 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
21190 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
211a0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
211b0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
211c0 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
211d0 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
211e0 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
211f0 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
21200 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
21210 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
21220 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
21230 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
21240 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
21250 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
21260 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
21270 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
21280 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
21290 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
212a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
212b0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
212c0 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
212d0 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
212e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
212f0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
21300 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
21310 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
21320 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
21330 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
21340 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21350 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
21360 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
21370 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
21380 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
21390 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
213a0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
213b0 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
213c0 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
213d0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
213e0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
213f0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
21400 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
21410 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
21420 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
21430 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
21440 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
21450 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
21460 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
21470 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
21480 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21490 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
214a0 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
214b0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
214c0 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
214d0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
214e0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
214f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
21500 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
21510 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
21520 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
21530 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
21540 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21550 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
21560 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
21570 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
21580 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
21590 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
215a0 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
215b0 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
215c0 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
215d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
215e0 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
215f0 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
21600 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
21610 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21620 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
21630 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
21640 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20  , TK_ALL, 0));. 
21650 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
21660 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
21670 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
21680 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
21690 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
216a0 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
216b0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
216c0 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
216d0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  t = 0;.  p->selF
216e0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
216f0 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
21700 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
21710 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
21720 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
21730 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
21740 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
21750 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
21760 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21770 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
21780 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
21790 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
217a0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
217b0 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
217c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
217d0 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
217e0 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
217f0 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
21800 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
21810 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
21820 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
21830 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
21840 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
21850 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
21860 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
21870 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21880 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
21890 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
218a0 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
218b0 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
218c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
218d0 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
218e0 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
218f0 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
21900 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
21910 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
21920 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
21930 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
21940 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
21950 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
21960 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
21970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
21980 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20  rrent outermost 
21990 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
219a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
219b0 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
219c0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
219d0 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
219e0 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
219f0 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
21a00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
21a10 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
21a20 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
21a30 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
21a40 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
21a50 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
21a60 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
21a70 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
21a80 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
21a90 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
21aa0 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
21ab0 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
21ac0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
21ad0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
21ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
21af0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21b00 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
21b10 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
21b20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
21b30 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
21b40 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
21b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21b60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21b70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
21b80 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
21b90 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
21ba0 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
21bb0 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
21bc0 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
21bd0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
21be0 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
21bf0 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
21c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21c10 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
21c20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
21c30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21c40 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
21c50 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
21c60 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
21c70 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
21c80 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
21c90 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
21ca0 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
21cb0 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
21cc0 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
21cd0 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
21ce0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
21cf0 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
21d00 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
21d10 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
21d20 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
21d30 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
21d40 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
21d50 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
21d60 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
21d70 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
21d80 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
21d90 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
21da0 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
21db0 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
21dc0 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
21dd0 7c 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  | pParse->pWith=
21de0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  =0 );.  if( pWit
21df0 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
21e00 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
21e10 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
21e20 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
21e30 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62  h;.    pParse->b
21e40 46 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65  FreeWith = bFree
21e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
21e60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
21e70 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
21e80 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
21e90 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
21ea0 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
21eb0 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
21ec0 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
21ed0 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
21ee0 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
21ef0 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
21f00 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
21f10 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
21f20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
21f30 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
21f40 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
21f50 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
21f60 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
21f70 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
21f80 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
21f90 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
21fa0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
21fb0 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
21fc0 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
21fd0 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
21fe0 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
21ff0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
22000 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
22010 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
22020 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
22030 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
22040 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
22050 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
22060 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
22070 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
22080 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
22090 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
220a0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
220b0 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
220c0 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
220d0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
220e0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
220f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22100 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
22110 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
22120 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
22130 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22140 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
22150 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
22160 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
22170 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22180 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
22190 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
221a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
221b0 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
221c0 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
221d0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
22200 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
22210 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
22220 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
22230 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
22240 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
22250 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
22260 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
22270 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
22280 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
22290 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
222a0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
222b0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
222c0 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
222d0 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
222e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
222f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
22300 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
22310 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22320 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
22330 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
22340 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
22350 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
22360 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
22370 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
22380 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
22390 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  /* If pCte->zErr
223a0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
223b0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
223c0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
223d0 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
223e0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
223f0 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
22400 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
22410 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
22420 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
22430 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e   pCte->zErr is N
22440 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
22450 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
22460 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
22470 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
22480 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
22490 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72     if( pCte->zEr
224a0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
224b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
224c0 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70  e, pCte->zErr, p
224d0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
224e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
224f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
22500 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
22510 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
22520 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
22530 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
22540 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
22550 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
22560 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
22570 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22580 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
22590 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
225a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
225b0 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
225c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
225d0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
225e0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
225f0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
22600 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
22610 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
22620 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
22630 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
22640 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d  meral;.    pFrom
22650 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
22660 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22670 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
22680 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
22690 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
226a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
226b0 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
226c0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
226d0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
226e0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
226f0 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
22700 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
22710 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
22720 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
22730 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
22740 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
22750 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
22760 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
22770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
22780 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
22790 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
227a0 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
227b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
227c0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
227d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
227e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
227f0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
22800 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
22810 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
22820 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
22830 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
22840 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
22850 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
22860 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
22870 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
22880 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
22890 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
228a0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
228b0 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
228c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
228d0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
228e0 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
228f0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
22900 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
22910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22920 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
22930 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22940 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
22950 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
22960 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
22970 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
22980 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
22990 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
229a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
229b0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
229c0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
229d0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
229e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
229f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
22a00 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
22a10 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
22a20 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
22a30 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
22a40 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
22a50 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63   pCte->zErr = "c
22a60 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
22a70 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
22a80 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
22a90 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
22aa0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
22ab0 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
22ac0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
22ad0 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
22ae0 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
22af0 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72   pSel);..    for
22b00 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
22b10 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
22b20 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
22b30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
22b40 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
22b50 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
22b60 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
22b70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
22b80 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
22b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22ba0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22bb0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
22bc0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
22bd0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
22be0 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
22bf0 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
22c00 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
22c10 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
22c20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
22c30 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
22c40 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
22c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22c60 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
22c70 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
22c80 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
22c90 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
22ca0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
22cb0 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
22cc0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
22cd0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
22ce0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
22cf0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
22d00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
22d10 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
22d20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
22d30 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
22d40 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
22d50 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
22d60 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
22d70 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  >zErr = "recursi
22d80 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
22d90 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
22da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22db0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
22dc0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
22dd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
22de0 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  >zErr = 0;.    p
22df0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22e00 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
22e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22e20 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
22e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22e40 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
22e50 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
22e60 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
22e70 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
22e80 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
22e90 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
22ea0 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
22eb0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
22ec0 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
22ed0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
22ee0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22ef0 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
22f00 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
22f10 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
22f20 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
22f30 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
22f40 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
22f50 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
22f60 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
22f70 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
22f80 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
22f90 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
22fa0 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
22fb0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
22fc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
22fd0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
22fe0 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  e;.  With *pWith
22ff0 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
23000 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66  (p)->pWith;.  if
23010 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
23020 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23030 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
23040 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
23050 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
23060 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ter;.  }.}.#else
23070 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
23080 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
23090 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
230a0 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
230b0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
230c0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
230d0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
230e0 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
230f0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
23100 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23110 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
23120 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
23130 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
23140 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
23150 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
23160 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23170 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
23180 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
23190 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
231a0 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
231b0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
231c0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
231d0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
231e0 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
231f0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
23200 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
23210 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
23220 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
23230 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
23240 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
23250 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
23260 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
23270 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
23280 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
23290 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
232a0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
232b0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
232c0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
232d0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
232e0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
232f0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
23300 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
23310 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
23320 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
23330 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
23340 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
23350 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
23360 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
23370 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
23380 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
23390 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
233a0 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
233b0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
233c0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
233d0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
233e0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
233f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
23400 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
23410 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
23420 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
23430 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
23440 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
23450 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
23460 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
23470 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
23480 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
23490 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
234a0 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
234b0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
234c0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
234d0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
234e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
234f0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
23500 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
23510 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
23520 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
23530 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
23540 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
23550 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
23560 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23570 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
23580 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23590 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
235a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
235b0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
235c0 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
235d0 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
235e0 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
235f0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
23600 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
23610 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
23620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
23630 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
23640 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
23650 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
23660 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
23670 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
23680 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
23690 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
236a0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
236b0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73  = p->pEList;.  s
236c0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
236d0 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74  Parse, findRight
236e0 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20  most(p)->pWith, 
236f0 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
23700 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
23710 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
23720 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
23730 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
23740 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23750 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
23760 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
23770 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
23780 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
23790 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
237a0 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
237b0 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
237c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
237d0 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
237e0 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
237f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
23800 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
23810 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
23820 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
23830 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
23840 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
23850 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
23860 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
23870 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
23880 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
23890 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
238a0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
238b0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
238c0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73  e *pTab;.    ass
238d0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65  ert( pFrom->isRe
238e0 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
238f0 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  rom->pTab );.   
23900 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52 65   if( pFrom->isRe
23910 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
23920 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ue;.    if( pFro
23930 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
23940 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
23950 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
23960 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
23970 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
23980 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
23990 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
239a0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
239b0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
239c0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
239d0 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28    selectPopWith(
239e0 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65 6e  pWalker, p);.#en
239f0 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
23a00 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23a10 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23a20 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
23a30 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
23a40 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
23a50 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23a60 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
23a70 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
23a80 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
23a90 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
23aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23ab0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
23ac0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
23ad0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
23ae0 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
23af0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
23b00 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
23b10 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
23b20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
23b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23b40 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23b60 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
23b70 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  er, pSel);.     
23b80 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
23b90 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
23ba0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23bb0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
23bc0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
23bd0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
23be0 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
23bf0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
23c00 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
23c10 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
23c20 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c   "sqlite_sq_%p",
23c30 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
23c40 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
23c50 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
23c60 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
23c70 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
23c80 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
23c90 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
23ca0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
23cb0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
23cc0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
23cd0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23ce0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
23cf0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
23d00 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
23d10 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
23d20 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
23d30 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
23d40 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
23d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
23d60 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
23d70 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
23d80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23d90 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
23da0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
23db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
23dc0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23dd0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
23de0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
23df0 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
23e00 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
23e10 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23e20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
23e30 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29  ->nRef==0xffff )
23e40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23e50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23e60 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
23e70 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
23e80 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
23e90 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
23ea0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
23eb0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
23ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
23ed0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
23ee0 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
23ef0 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
23f00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
23f10 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
23f20 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
23f30 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
23f40 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
23f50 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
23f60 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
23f70 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
23f80 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
23f90 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
23fa0 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
23fb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
23fc0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
23fd0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
23fe0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
23ff0 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
24000 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
24010 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
24020 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
24030 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
24040 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
24050 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
24060 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
24070 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
24080 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
24090 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
240a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
240b0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
240c0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
240d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
240e0 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
240f0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
24100 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
24110 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
24120 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
24130 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
24140 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
24150 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24160 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
24170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
24180 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
24190 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
241a0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
241b0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
241c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
241d0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
241e0 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
241f0 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
24200 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
24210 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
24220 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
24230 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
24240 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
24250 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
24260 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
24270 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
24280 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
24290 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
242a0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
242b0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
242c0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
242d0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
242e0 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
242f0 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
24300 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
24310 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
24320 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
24330 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
24340 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
24350 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
24360 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
24370 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
24380 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
24390 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
243a0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
243b0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
243c0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
243d0 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
243e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
243f0 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
24400 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
24410 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
24420 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
24430 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
24440 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
24450 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
24460 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
24470 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
24480 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
24490 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
244a0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
244b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
244c0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
244d0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
244e0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
244f0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
24500 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
24510 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
24520 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
24530 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
24540 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
24550 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
24560 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
24570 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
24580 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
24590 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
245a0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
245b0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
245c0 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
245d0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
245e0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
245f0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
24600 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
24610 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
24620 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
24630 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
24640 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
24650 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
24660 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
24670 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
24680 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
24690 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
246a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
246b0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
246e0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
246f0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
24700 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
24710 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
24720 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
24730 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
24740 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
24750 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
24760 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
24770 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
24780 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
24790 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
247a0 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
247b0 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
247c0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
247d0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
247e0 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
247f0 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
24800 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
24810 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
24820 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
24830 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
24840 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
24850 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
24860 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
24870 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
24880 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
24890 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
248a0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
248b0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
248c0 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
248d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
248e0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
248f0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
24900 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
24910 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
24920 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
24930 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
24940 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
24950 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
24960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24970 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
24980 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
24990 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
249a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
249b0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
249c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
249d0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
249e0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
249f0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
24a00 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
24a10 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
24a20 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
24a30 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
24a40 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
24a50 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
24a60 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
24a70 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
24a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24a90 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
24aa0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
24ab0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
24ac0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
24ad0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
24ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24af0 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
24b00 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
24b10 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
24b20 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
24b30 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
24b40 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
24b50 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
24b60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
24b70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
24b80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24b90 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
24ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
24bb0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
24bc0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
24bd0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
24be0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
24bf0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
24c00 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
24c10 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
24c20 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
24c30 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
24c40 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
24c50 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
24c60 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
24c70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
24c80 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
24c90 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
24ca0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
24cb0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
24cc0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
24cd0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
24ce0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
24cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24d00 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
24d10 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
24d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24d30 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
24d40 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
24d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24d60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24d70 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
24d80 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
24d90 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
24da0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
24db0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
24dc0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
24dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
24de0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
24df0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
24e00 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
24e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24e20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24e40 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
24e50 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
24e60 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
24e70 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
24e80 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
24e90 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
24ea0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
24eb0 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
24ec0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
24ed0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
24ee0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
24ef0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
24f00 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
24f10 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
24f20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
24f30 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
24f40 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
24f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
24f60 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
24f70 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
24f80 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
24f90 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
24fa0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
24fb0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
24fc0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
24fd0 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
24fe0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
24ff0 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
25000 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
25010 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
25020 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
25030 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
25040 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
25050 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
25060 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
25070 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25080 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
25090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
250a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
250b0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
250c0 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
250d0 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
250e0 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
250f0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
25100 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
25110 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
25120 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
25130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
25140 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
25150 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
25160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25170 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
25180 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
25190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
251a0 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
251b0 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
251c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
251d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
251e0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
251f0 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
25200 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
25210 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
25230 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
25240 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
25250 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
25260 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
25270 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
25280 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
25290 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
252a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
252b0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
252c0 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
252d0 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
252e0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
252f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
25300 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
25310 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25350 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
25360 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
25370 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
25380 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
25390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
253a0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
253b0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
253c0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
253d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253e0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
253f0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
25400 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
25410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25420 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25450 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
25460 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
25470 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
25480 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
25490 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
254a0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
254b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
254c0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
254d0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
254e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
254f0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
25510 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
25520 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
25530 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
25540 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
25550 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
25560 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
25570 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
25580 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25590 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
255b0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
255c0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
255d0 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
255e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
255f0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
25600 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
25610 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
25620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
25640 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
25650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25660 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
25670 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
25680 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
25690 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
256a0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
256b0 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
256d0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
256e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
256f0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
25700 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25710 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
25720 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25730 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
25740 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
25750 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
25760 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
25770 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
25780 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
25790 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
257a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
257b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
257c0 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
257d0 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
257e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
257f0 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
25800 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
25810 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
25830 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
25840 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
25850 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
25860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25870 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
25880 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
25890 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
258a0 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
258b0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
258c0 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
258d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
258e0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
258f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
25900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25910 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
25920 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
25930 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
25940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
25970 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
25980 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
259a0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
259b0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
259c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
259d0 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
259e0 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
259f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25a00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25a10 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
25a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25a40 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
25a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
25a60 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
25a70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25a80 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
25a90 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
25aa0 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
25ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
25ad0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25ae0 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
25af0 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
25b00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
25b10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
25b20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
25b30 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
25b40 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
25b50 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
25b60 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
25b70 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
25b80 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
25b90 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
25ba0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
25bb0 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
25bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25bd0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
25be0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
25bf0 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
25c00 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
25c10 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
25c20 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
25c30 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
25c40 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
25c50 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
25c60 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
25c70 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
25c80 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
25c90 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
25ca0 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
25cb0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
25cc0 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
25cd0 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
25ce0 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
25cf0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
25d00 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
25d10 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
25d20 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
25d30 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
25d40 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
25d50 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
25d60 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
25d70 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
25d80 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
25d90 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
25da0 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
25db0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
25dc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
25dd0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
25de0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
25df0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
25e00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25e10 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
25e20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
25e30 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
25e40 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
25e50 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
25e60 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
25e70 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
25e80 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
25e90 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
25ea0 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
25eb0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
25ec0 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
25ed0 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
25ee0 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
25ef0 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
25f00 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
25f10 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
25f20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
25f30 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
25f40 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
25f50 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
25f60 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
25f70 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
25f80 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
25f90 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
25fa0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
25fb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
25fc0 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
25fd0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
25fe0 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
25ff0 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
26000 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
26010 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
26020 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
26030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
26040 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
26050 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
26060 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
26070 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
26080 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
26090 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
260a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
260b0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
260c0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
260d0 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
260e0 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
260f0 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
26100 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
26110 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
26120 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
26130 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
26140 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
26150 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
26160 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
26170 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
26180 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
26190 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
261a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
261b0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
261c0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
261d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
261e0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
261f0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
26200 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
26210 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
26220 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
26230 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
26240 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
26250 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
26260 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
26270 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
26280 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
26290 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
262a0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
262b0 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
262c0 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
262d0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
262e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
262f0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
26300 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
26310 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
26320 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
26330 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
26340 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
26350 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
26360 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
26370 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
26380 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
26390 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
263a0 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
263b0 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
263c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
263d0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
263e0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
263f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
26400 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
26410 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
26420 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
26430 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
26440 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
26450 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
26460 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
26470 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
26480 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
26490 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
264a0 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
264b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
264c0 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
264d0 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
264e0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
264f0 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
26500 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
26510 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
26520 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
26530 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
26540 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
26550 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
26560 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
26570 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
26580 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
26590 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
265a0 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62  Tab!=0) && (pTab
265b0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
265c0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
265d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
265e0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
265f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
26600 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
26610 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
26620 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26630 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
26640 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  l ){.          w
26650 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
26660 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
26670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
26680 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
26690 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
266a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
266b0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pSel);.       
266c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
266d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
266e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
266f0 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
26700 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
26710 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
26720 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
26730 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
26740 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
26750 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
26760 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
26770 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
26780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
26790 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
267a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
267b0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
267c0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
267d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
267e0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
267f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26800 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
26810 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
26820 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
26830 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
26840 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
26850 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
26860 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
26870 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
26880 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
26890 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
268a0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
268b0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
268c0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
268d0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
268e0 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
268f0 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
26900 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
26910 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
26920 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
26930 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
26940 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
26950 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
26960 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
26970 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
26980 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
26990 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
269a0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
269b0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
269c0 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
269d0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
269e0 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
269f0 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
26a00 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
26a10 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
26a20 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
26a30 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
26a40 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
26a50 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
26a60 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
26a70 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
26a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a90 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
26aa0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
26ab0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
26ac0 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
26ad0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
26ae0 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
26af0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
26b00 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
26b10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
26b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26b30 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
26b40 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
26b50 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
26b60 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
26b70 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
26b80 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
26b90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26ba0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
26bb0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
26bc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26bd0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26be0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
26bf0 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
26c00 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
26c10 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
26c20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
26c30 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
26c40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
26c50 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
26c60 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
26c70 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
26c80 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
26c90 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
26ca0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
26cb0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
26cc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
26cd0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
26ce0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
26cf0 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
26d00 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
26d10 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
26d20 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
26d30 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
26d40 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
26d50 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
26d60 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
26d70 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
26d80 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
26d90 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
26da0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
26db0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
26dc0 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
26dd0 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
26de0 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
26df0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
26e00 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
26e10 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
26e20 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
26e30 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
26e40 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
26e50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
26e60 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
26e70 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
26e80 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
26e90 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
26ea0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
26eb0 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
26ec0 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
26ed0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
26ee0 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
26ef0 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
26f00 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
26f10 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
26f20 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
26f30 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
26f40 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
26f50 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
26f60 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
26f70 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
26f80 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
26f90 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
26fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
26fb0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
26fc0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
26fd0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
26fe0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
26ff0 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
27000 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
27010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
27020 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
27030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27040 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
27050 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
27060 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
27070 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
27080 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
27090 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
270a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
270b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
270c0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
270d0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
270e0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
270f0 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
27100 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
27110 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
27120 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
27130 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
27140 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
27150 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
27160 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
27170 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
27180 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27190 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
271a0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
271b0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
271c0 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
271d0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
271e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
271f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
27200 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
27210 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
27220 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
27230 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
27240 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
27250 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
27260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27270 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
27280 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
27290 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
272a0 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
272b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
272c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
272d0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
272e0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
272f0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
27320 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
27330 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
27340 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
27350 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
27360 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
27370 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
27380 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
27390 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
273a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
273b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
273c0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
273d0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
273e0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
273f0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
27400 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
27410 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
27420 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
27430 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
27440 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
27450 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
27460 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
27470 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
27480 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
27490 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
274a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
274b0 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
274c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
274d0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
274e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
274f0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
27500 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
27510 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
27520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27530 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
27540 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
27550 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
27560 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
27570 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
27580 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
27590 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
275a0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
275b0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
275c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
275d0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
275e0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
275f0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
27600 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
27610 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
27620 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
27630 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
27640 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
27650 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
27660 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
27670 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
27680 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
27690 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
276a0 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
276b0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
276c0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
276d0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
276e0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
276f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
27700 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
27710 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
27720 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
27730 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
27740 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
27750 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
27760 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
27770 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
27780 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
27790 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
277a0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
277b0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
277c0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
277d0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
277e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
277f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
27800 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c  ist, regAgg, SQL
27810 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
27820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27830 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
27840 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
27850 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
27860 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
27870 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
27880 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27890 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
278a0 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
278b0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
278c0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
278d0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
278e0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
278f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27900 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
27910 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
27920 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
27930 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
27940 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
27950 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
27960 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
27970 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
27980 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
27990 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
279a0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
279b0 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
279c0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
279d0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
279e0 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
279f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
27a00 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
27a10 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
27a20 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
27a30 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
27a40 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
27a50 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
27a60 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
27a70 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
27a80 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
27a90 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
27aa0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
27ab0 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
27ac0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
27ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27ae0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
27af0 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
27b00 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
27b10 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
27b20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27b30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
27b40 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
27b50 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
27b80 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
27b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
27ba0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
27bb0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
27bc0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
27bd0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
27be0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
27bf0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
27c00 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
27c10 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
27c20 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
27c30 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
27c40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27c50 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
27c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27c70 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27c80 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
27c90 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
27ca0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
27cb0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
27cc0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
27cd0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
27ce0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27cf0 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
27d00 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
27d10 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
27d20 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
27d30 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
27d40 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
27d50 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
27d60 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
27d70 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
27d80 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
27d90 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
27da0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
27db0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
27dc0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
27dd0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
27de0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
27df0 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
27e00 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
27e10 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
27e20 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
27e30 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
27e40 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
27e50 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
27e60 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
27e70 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
27e80 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
27e90 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
27ea0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
27eb0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
27ec0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
27ed0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
27ee0 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
27ef0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
27f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27f10 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
27f20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
27f30 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
27f40 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
27f50 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
27f60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
27f70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
27f80 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
27f90 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
27fa0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
27fb0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
27fc0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
27fd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
27fe0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
27ff0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28000 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
28010 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
28020 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
28030 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
28040 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
28050 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
28060 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
28070 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
28080 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
28090 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
280a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
280b0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
280c0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
280d0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
280e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
280f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
28100 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
28110 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28130 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
28140 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
28150 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
28160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28170 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
28180 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
28190 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
281a0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
281b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
281c0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
281d0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
281e0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
281f0 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
28200 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
28210 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
28220 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
28230 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
28240 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
28250 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
28260 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
28270 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
28280 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
28290 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
282a0 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
282b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
282c0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
282d0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
282e0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
282f0 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
28300 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
28310 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
28320 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
28330 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
28340 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
28350 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
28360 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
28370 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
28380 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
28390 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
283a0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
283b0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
283c0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
283d0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
283e0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
283f0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
28400 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
28410 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
28420 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
28430 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
28440 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
28450 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
28460 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
28470 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
28480 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
28490 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
284a0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
284b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
284c0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
284d0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
284e0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
284f0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
28500 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
28510 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
28520 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
28530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
28540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
28550 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
28560 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
28570 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28580 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28590 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
285a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
285b0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
285c0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
285d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
285e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28600 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
28610 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
28620 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
28630 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
28640 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
28650 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
28660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28670 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
28680 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
28690 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
286a0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
286b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
286c0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
286d0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
286e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
286f0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
28700 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
28710 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
28720 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
28730 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
28740 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
28750 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
28760 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
28770 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
28780 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
28790 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
287a0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
287b0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
287c0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
287d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
287e0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
287f0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
28800 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
28810 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
28820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
28830 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
28840 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
28850 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
28860 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
28870 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
28880 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
28890 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
288a0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
288b0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
288c0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
288d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
288e0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
288f0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
28900 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
28910 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
28920 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
28930 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
28940 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
28950 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
28960 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
28970 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
28980 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
28990 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
289a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
289b0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
289c0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
289d0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
289e0 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
289f0 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
28a00 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
28a10 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
28a20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28a30 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
28a40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28a50 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
28a60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
28a70 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
28a80 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
28a90 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
28aa0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
28ab0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
28ac0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
28ad0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
28ae0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
28af0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
28b00 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
28b10 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
28b20 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
28b30 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
28b40 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
28b50 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
28b60 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
28b70 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
28b80 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
28b90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
28ba0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
28bb0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
28bc0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
28bd0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
28be0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
28bf0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
28c00 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
28c10 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
28c20 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
28c30 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
28c40 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
28c50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28c60 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28c70 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
28c80 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
28c90 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
28ca0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
28cb0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
28cc0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
28cd0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
28ce0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
28cf0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28d00 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
28d10 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
28d20 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
28d30 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
28d40 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
28d50 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28d60 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
28d70 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
28d80 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
28d90 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
28da0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
28db0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
28dc0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
28dd0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
28de0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
28df0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
28e00 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
28e10 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
28e20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
28e30 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28e40 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
28e50 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
28e60 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
28e70 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
28e80 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
28e90 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
28ea0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
28eb0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
28ec0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
28ed0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
28ee0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
28ef0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
28f00 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
28f10 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
28f20 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28f30 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28f40 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
28f50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
28f60 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
28f70 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
28f80 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
28f90 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
28fa0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
28fb0 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
28fc0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
28fd0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
28fe0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
28ff0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
29000 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
29010 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
29020 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
29030 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
29040 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
29050 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
29060 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29070 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
29080 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
29090 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
290a0 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
290b0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
290c0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
290d0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
290e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
290f0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
29100 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
29110 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
29120 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
29130 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
29140 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
29150 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
29160 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
29170 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
29180 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
29190 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
291a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
291b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
291c0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
291d0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
291e0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
291f0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
29200 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
29210 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
29220 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
29230 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
29240 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
29250 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
29260 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
29270 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
29280 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
29290 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
292a0 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
292b0 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
292c0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
292d0 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
292e0 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
292f0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
29300 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
29310 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
29320 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
29330 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
29340 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
29350 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
29360 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
29370 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
29380 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
29390 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
293a0 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
293b0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
293c0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
293d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
293e0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
293f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
29400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29410 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
29420 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
29430 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29440 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
29450 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
29460 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
29470 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
29480 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
29490 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
294a0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
294b0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
294c0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
294d0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
294e0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
294f0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
29500 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
29510 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
29520 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
29530 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
29540 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
29550 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
29560 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
29570 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
29580 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
29590 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
295a0 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
295b0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
295c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
295d0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
295e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
295f0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
29600 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
29610 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
29620 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
29630 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
29640 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
29650 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
29660 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
29670 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
29680 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
29690 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
296a0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
296b0 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
296c0 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
296d0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
296e0 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
296f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
29700 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
29710 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
29720 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
29730 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
29740 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
29750 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
29760 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
29770 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
29780 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
29790 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
297a0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
297b0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
297c0 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
297d0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
297e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
297f0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
29800 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
29810 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
29820 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
29830 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
29840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29850 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
29860 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
29870 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
29880 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
29890 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
298a0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
298b0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
298c0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
298d0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
298e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
298f0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
29900 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
29910 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29920 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
29930 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
29940 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
29950 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
29960 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
29970 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
29980 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
29990 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
299a0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
299b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
299c0 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
299d0 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  w);.      pItem-
299e0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  >viaCoroutine = 
299f0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
29a00 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
29a10 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
29a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29a30 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
29a40 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
29a50 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
29a60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29a70 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
29a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
29a90 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
29aa0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
29ab0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
29ac0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
29ad0 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
29ae0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
29af0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
29b00 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
29b10 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
29b20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29b30 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
29b40 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
29b50 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
29b60 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
29b70 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
29b80 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
29b90 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
29ba0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
29bb0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
29bc0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
29bd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
29be0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
29bf0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
29c00 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
29c10 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
29c20 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
29c30 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
29c40 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
29c50 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
29c60 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
29c70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
29c80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
29c90 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
29ca0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
29cb0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29cc0 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
29cd0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
29ce0 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  ->isCorrelated==
29cf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
29d00 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
29d10 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
29d20 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
29d30 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
29d40 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
29d50 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
29d60 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
29d70 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29d80 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
29d90 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
29da0 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
29db0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
29dc0 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
29dd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
29de0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29df0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
29e00 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
29e10 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29e20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29e30 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
29e40 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
29e50 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
29e60 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
29e70 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
29e80 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29e90 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
29ea0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
29eb0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
29ec0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
29ed0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
29ee0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
29ef0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
29f00 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
29f10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
29f20 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
29f30 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
29f40 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
29f50 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
29f60 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
29f70 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
29f80 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
29f90 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
29fa0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
29fb0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
29fc0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
29fd0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
29fe0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
29ff0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2a000 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
2a010 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2a020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a030 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
2a040 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
2a050 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2a060 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2a070 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2a080 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
2a090 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
2a0a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2a0b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2a0c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
2a0d0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
2a0e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2a0f0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
2a100 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2a110 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
2a120 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2a130 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
2a140 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2a150 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2a160 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
2a170 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
2a180 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
2a190 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
2a1a0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2a1b0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
2a1c0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
2a1d0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2a1e0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2a1f0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
2a200 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2a210 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2a220 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
2a230 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
2a240 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
2a250 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
2a260 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
2a270 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2a280 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2a290 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2a2a0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2a2b0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2a2c0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2a2d0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2a2e0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2a2f0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2a300 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2a310 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2a320 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2a330 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2a340 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2a350 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2a360 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2a370 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2a380 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
2a390 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
2a3a0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
2a3b0 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
2a3c0 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
2a3d0 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
2a3e0 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
2a3f0 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
2a400 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
2a410 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
2a420 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2a430 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
2a440 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
2a450 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
2a460 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
2a470 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2a480 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2a490 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
2a4a0 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
2a4b0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
2a4c0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
2a4d0 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
2a4e0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
2a4f0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
2a500 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
2a510 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
2a520 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
2a530 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
2a540 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
2a550 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
2a560 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
2a570 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
2a580 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
2a590 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
2a5a0 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
2a5b0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
2a5c0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
2a5d0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
2a5e0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
2a5f0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
2a600 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
2a610 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2a620 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2a630 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
2a640 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
2a650 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a660 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
2a670 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
2a680 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2a690 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2a6a0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2a6b0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
2a6c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2a6d0 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
2a6e0 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
2a6f0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2a700 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f  By;.    sSort.pO
2a710 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2a720 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2a730 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2a740 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2a750 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2a760 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2a770 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2a780 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2a790 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2a7a0 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2a7b0 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2a7c0 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2a7d0 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2a7e0 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2a7f0 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2a800 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2a810 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2a820 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2a830 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2a840 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2a850 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
2a860 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2a870 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
2a880 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
2a890 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
2a8a0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2a8b0 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
2a8c0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2a8d0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
2a8e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2a8f0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2a900 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2a910 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
2a920 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2a930 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2a940 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
2a950 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
2a960 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
2a970 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2a980 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
2a990 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2a9a0 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2a9b0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2a9c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2a9d0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2a9e0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2a9f0 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2aa00 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
2aa10 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2aa20 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2aa30 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2aa40 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2aa50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2aa60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2aa70 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2aa80 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2aa90 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2aaa0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2aab0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2aac0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2aad0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2aae0 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2aaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2ab00 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2ab10 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2ab20 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2ab30 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2ab40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2ab50 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2ab60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2ab70 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2ab80 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2ab90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2aba0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2abb0 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2abc0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2abd0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2abe0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2abf0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2ac00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2ac10 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
2ac20 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
2ac30 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
2ac40 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2ac50 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2ac60 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2ac70 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2ac80 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2ac90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2aca0 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
2acb0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
2acc0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
2acd0 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
2ace0 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2acf0 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2ad00 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2ad10 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
2ad20 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2ad30 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2ad40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2ad50 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2ad60 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2ad70 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2ad80 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ad90 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2ada0 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2adb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2adc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2adf0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2ae00 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2ae30 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2ae40 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2ae50 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2ae80 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2ae90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2aea0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2aeb0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2aec0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2aed0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2aee0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2aef0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2af00 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2af10 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2af20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2af30 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2af40 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2af50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2af60 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2af70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2af80 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2af90 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2afa0 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2afb0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2afc0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2afd0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2afe0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2aff0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2b000 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2b010 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2b020 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2b050 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2b060 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2b070 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2b080 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2b090 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2b0a0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2b0b0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2b0c0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2b0d0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2b0e0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2b0f0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2b100 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2b110 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2b120 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2b130 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2b140 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2b150 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2b160 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2b170 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2b180 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2b190 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2b1a0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2b1b0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2b1c0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2b1d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2b1e0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2b1f0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2b200 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2b210 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2b220 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2b230 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2b240 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2b250 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2b260 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2b270 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2b280 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2b290 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2b2a0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2b2b0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2b2c0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2b2d0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2b2e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b2f0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2b300 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2b310 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2b320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b330 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2b340 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2b350 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2b360 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2b370 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2b380 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2b390 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2b3a0 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2b3b0 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2b3c0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b3e0 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2b3f0 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b410 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2b420 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2b430 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2b440 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2b450 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2b460 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2b470 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2b480 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2b490 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2b4a0 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2b4b0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2b4c0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2b4d0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2b4e0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2b4f0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2b500 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2b510 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2b520 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2b530 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2b540 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2b550 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2b560 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2b570 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2b580 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2b590 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b5a0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2b5b0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2b5c0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2b5d0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2b5e0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2b5f0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2b600 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2b610 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2b620 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2b630 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2b640 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2b650 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2b680 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2b690 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2b6a0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2b6b0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2b6c0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2b6d0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2b6e0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2b6f0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2b700 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2b710 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2b720 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2b730 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2b740 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2b750 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2b760 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2b770 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2b780 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2b790 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2b7a0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2b7b0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2b7c0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2b7d0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2b7e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2b7f0 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2b800 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2b810 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2b820 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2b830 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2b840 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2b850 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2b860 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2b870 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2b880 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2b890 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2b8a0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2b8b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2b8d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2b8e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2b8f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2b900 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2b910 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2b920 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2b930 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2b940 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2b950 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2b960 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2b970 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2b980 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2b990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b9a0 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2b9b0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2b9c0 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2b9d0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2b9e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2b9f0 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2ba00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2ba10 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2ba20 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2ba30 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2ba40 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2ba50 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2ba60 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2ba70 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2ba80 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2ba90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2baa0 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2bab0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2bac0 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2bad0 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2bae0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2baf0 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2bb00 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2bb10 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2bb20 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2bb30 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2bb40 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2bb50 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2bb60 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2bb70 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2bb80 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2bb90 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2bba0 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2bbb0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2bbc0 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2bbd0 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2bbe0 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2bbf0 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2bc00 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2bc10 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2bc20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2bc30 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2bc40 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2bc50 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2bc60 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2bc70 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2bc80 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2bc90 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2bca0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2bcb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2bcc0 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2bcd0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2bce0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2bcf0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2bd00 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2bd10 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2bd20 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2bd30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2bd40 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2bd50 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2bd60 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2bd70 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2bd80 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2bd90 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2bda0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2bdb0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2bdc0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2bdd0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2bde0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2bdf0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2be00 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2be10 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2be20 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2be30 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2be40 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2be50 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2be60 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2be70 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2be80 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2be90 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2bea0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2beb0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2bec0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2bed0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2bee0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2bef0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2bf00 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2bf10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2bf20 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2bf30 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2bf40 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2bf50 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2bf60 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2bf70 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2bf80 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2bf90 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2bfa0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2bfb0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2bfc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2bfd0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2bfe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2bff0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c000 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2c010 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2c020 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2c030 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2c040 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2c050 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2c060 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2c070 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2c080 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2c090 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2c0a0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2c0b0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2c0c0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2c0d0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2c0e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2c0f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2c100 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2c110 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2c120 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2c130 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2c140 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2c150 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2c160 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2c170 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2c180 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2c190 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2c1a0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2c1b0 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2c1c0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2c1d0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2c1e0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2c1f0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2c200 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2c210 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2c220 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2c230 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2c240 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2c250 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2c260 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2c270 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2c280 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2c290 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2c2a0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2c2b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2c2c0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2c2d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2c2e0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2c2f0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2c300 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2c310 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2c320 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2c330 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2c340 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2c350 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2c360 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2c370 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2c380 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2c390 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2c3a0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2c3b0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2c3c0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2c3d0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2c3e0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2c3f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2c400 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2c410 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2c420 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2c430 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2c440 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2c450 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2c460 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2c470 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2c480 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2c490 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2c4a0 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2c4b0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2c4c0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2c4d0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2c4e0 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2c4f0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2c500 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2c510 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2c520 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2c530 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2c540 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2c550 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c560 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2c570 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c580 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c590 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
2c5a0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2c5b0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2c5c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2c5d0 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2c5e0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2c5f0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2c600 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2c610 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2c620 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2c630 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2c640 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2c650 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2c660 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2c670 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2c680 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2c690 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2c6a0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2c6b0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2c6c0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2c6d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2c6e0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2c6f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c700 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2c710 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2c720 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2c730 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2c740 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c750 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2c760 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2c770 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2c780 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2c790 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2c7a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2c7b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2c7c0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2c7d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2c7e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2c7f0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2c800 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2c810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c820 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2c830 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2c840 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c850 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2c860 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2c870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c880 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2c890 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2c8a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c8b0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2c8c0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2c8d0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2c8e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c8f0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2c900 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2c910 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2c920 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2c930 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2c940 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2c950 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2c960 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2c970 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2c980 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2c990 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2c9a0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2c9b0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2c9c0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2c9d0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2c9e0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2c9f0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2ca00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2ca10 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2ca20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2ca30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2ca40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ca50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2ca60 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2ca70 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2ca80 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2ca90 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2caa0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2cab0 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2cac0 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2cad0 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2cae0 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2caf0 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2cb00 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2cb10 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2cb20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2cb30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2cb40 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2cb50 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2cb60 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2cb70 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2cb80 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2cb90 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2cba0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2cbb0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2cbc0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2cbd0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2cbe0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2cbf0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2cc00 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2cc10 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2cc20 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2cc30 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2cc40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2cc50 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2cc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cc70 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2cc80 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2cc90 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2cca0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2ccb0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2ccc0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2ccd0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2cce0 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2ccf0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2cd00 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2cd10 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2cd20 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2cd30 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2cd40 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2cd50 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2cd60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2cd70 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2cd80 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2cd90 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2cda0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2cdb0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2cdc0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2cdd0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2cde0 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2cdf0 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2ce00 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2ce10 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce30 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2ce40 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2ce50 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2ce60 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2ce70 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2ce80 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2ce90 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2cea0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2ceb0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2cec0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2ced0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2cee0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cef0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2cf00 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2cf10 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2cf20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2cf30 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2cf40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cf50 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2cf60 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2cf70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2cf80 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2cf90 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2cfa0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2cfb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2cfc0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2cfd0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2cfe0 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
2cff0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2d000 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2d010 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2d020 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2d030 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2d040 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
2d050 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
2d060 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
2d070 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2d080 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2d090 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
2d0a0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
2d0b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
2d0c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
2d0d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
2d0e0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
2d0f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d110 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
2d120 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
2d130 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
2d140 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d150 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d180 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
2d190 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2d1a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d1b0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2d1c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d1d0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
2d1e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2d1f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2d200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d210 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
2d220 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
2d230 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
2d240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d250 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d260 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
2d270 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2d280 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
2d290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2d2a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2d2b0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
2d2c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d2d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2d2e0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
2d2f0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2d300 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2d310 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2d320 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2d330 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
2d340 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
2d350 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2d360 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
2d370 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2d380 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2d390 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2d3a0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
2d3b0 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
2d3c0 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
2d3d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d3e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2d3f0 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
2d400 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2d410 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
2d420 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2d430 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
2d440 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d450 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2d460 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
2d470 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2d480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2d490 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
2d4a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2d4b0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
2d4c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
2d4d0 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
2d4e0 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
2d4f0 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
2d500 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
2d510 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
2d520 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
2d530 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
2d540 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
2d550 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2d560 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
2d570 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
2d580 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
2d590 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2d5a0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2d5b0 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
2d5c0 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
2d5d0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
2d5e0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2d5f0 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
2d600 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2d610 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
2d620 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
2d630 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
2d640 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
2d650 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
2d660 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
2d670 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2d680 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
2d690 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
2d6a0 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
2d6b0 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
2d6c0 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
2d6d0 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
2d6e0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2d6f0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d710 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d720 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d730 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2d740 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2d750 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2d760 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2d770 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2d780 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2d790 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2d7a0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2d7b0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2d7c0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2d7d0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2d7e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2d7f0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2d800 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2d810 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2d820 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2d830 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2d840 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2d850 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2d860 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2d870 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2d880 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2d890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d8a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2d8b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2d8c0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2d8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d8e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d8f0 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2d900 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2d910 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20   sortOut);.     
2d920 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2d930 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
2d940 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
2d950 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2d960 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
2d970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d980 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2d990 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
2d9a0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  em+j);.         
2d9b0 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69   if( j==0 ) sqli
2d9c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2d9d0 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
2d9e0 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
2d9f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2da00 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
2da10 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2da20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2da30 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
2da40 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
2da50 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2da60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2da70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2da80 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
2da90 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
2daa0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2dab0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2dad0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
2dae0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
2daf0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2db00 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
2db10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2db20 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2db30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2db40 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
2db50 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65   j1+1); VdbeCove
2db60 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
2db70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2db80 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
2db90 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
2dba0 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
2dbb0 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
2dbc0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
2dbd0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
2dbe0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
2dbf0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
2dc00 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
2dc10 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
2dc20 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
2dc30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2dc40 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
2dc50 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
2dc60 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
2dc70 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
2dc80 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
2dc90 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
2dca0 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
2dcb0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2dcc0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
2dcd0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2dce0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2dcf0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
2dd00 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
2dd10 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
2dd20 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
2dd30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2dd40 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
2dd50 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
2dd60 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
2dd70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dd80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2dd90 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2dda0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2ddb0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2ddc0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2ddd0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
2dde0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ddf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2de00 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
2de10 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  ddrEnd); VdbeCov
2de20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2de30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2de40 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
2de50 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2de60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2de70 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2de80 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2de90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2dea0 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
2deb0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2dec0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2ded0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2dee0 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
2def0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
2df00 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
2df10 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
2df20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2df30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2df40 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
2df50 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2df60 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2df70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2df80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2df90 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
2dfa0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2dfb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2dfc0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
2dfd0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2dfe0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2dff0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
2e000 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
2e010 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2e020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e030 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2e040 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
2e050 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2e060 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
2e070 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2e080 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
2e090 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e0a0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2e0b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2e0c0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2e0d0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
2e0e0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
2e0f0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2e100 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
2e110 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
2e120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2e140 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2e150 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2e160 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2e170 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2e180 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
2e190 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
2e1a0 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
2e1b0 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
2e1c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e1d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2e1e0 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
2e1f0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2e200 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2e210 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
2e220 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2e230 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2e240 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
2e250 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
2e260 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
2e270 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
2e280 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
2e290 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2e2a0 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
2e2b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2e2c0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
2e2d0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
2e2e0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
2e2f0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
2e300 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2e310 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
2e320 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
2e330 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
2e340 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
2e350 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
2e360 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
2e370 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
2e380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e390 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
2e3a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2e3b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2e3c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e3d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2e3e0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
2e3f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2e400 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
2e410 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2e420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e430 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2e440 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
2e450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e460 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2e470 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2e480 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2e490 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2e4a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2e4b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e4c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e4d0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
2e4e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
2e4f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2e500 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2e510 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
2e520 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
2e530 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
2e540 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e550 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e560 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2e570 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
2e580 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2e590 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2e5a0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2e5b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2e5c0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
2e5d0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2e5e0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
2e5f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2e600 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2e610 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2e620 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  t, -1, &sSort,. 
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e640 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
2e650 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
2e670 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
2e680 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
2e690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e6a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2e6b0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2e6c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e6d0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
2e6e0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
2e6f0 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
2e700 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2e710 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2e720 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
2e730 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
2e740 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
2e750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2e760 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2e770 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2e780 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2e790 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2e7a0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
2e7b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2e7c0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
2e7d0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
2e7e0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
2e7f0 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
2e800 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
2e810 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
2e820 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
2e830 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
2e840 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
2e850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2e860 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
2e870 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
2e880 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
2e890 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
2e8a0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
2e8b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
2e8c0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
2e8d0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
2e8e0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
2e8f0 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
2e900 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
2e910 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
2e920 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
2e930 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
2e940 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2e950 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
2e960 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e970 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
2e980 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
2e990 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
2e9a0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
2e9b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e9c0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
2e9d0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
2e9e0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
2e9f0 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
2ea00 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
2ea10 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
2ea20 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
2ea30 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
2ea40 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
2ea50 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
2ea60 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
2ea70 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
2ea80 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
2ea90 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
2eaa0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
2eab0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
2eac0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
2ead0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
2eae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
2eaf0 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
2eb00 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
2eb10 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
2eb20 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
2eb30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2eb40 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
2eb50 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2eb60 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
2eb70 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2eb80 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2eb90 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
2eba0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
2ebb0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
2ebc0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
2ebd0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebf0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2ec00 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2ec10 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2ec20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
2ec40 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
2ec50 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
2ec60 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
2ec70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ec80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
2ec90 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
2eca0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
2ecb0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
2ecc0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
2ecd0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2ece0 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
2ecf0 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
2ed00 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2ed10 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
2ed20 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2ed30 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2ed40 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2ed50 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2ed60 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
2ed70 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
2ed80 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
2ed90 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
2eda0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
2edb0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2edc0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
2edd0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
2ede0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
2edf0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2ee00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2ee10 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
2ee20 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
2ee30 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
2ee40 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2ee50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2ee60 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
2ee70 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
2ee80 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
2ee90 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
2eea0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
2eeb0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
2eec0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
2eed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2eee0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2eef0 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
2ef00 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2ef10 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2ef20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
2ef30 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2ef40 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2ef50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ef60 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
2ef70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2ef80 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
2ef90 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
2efa0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2efb0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
2efc0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
2efd0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
2efe0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
2eff0 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
2f000 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2f010 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
2f020 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
2f030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f040 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
2f050 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
2f060 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
2f070 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
2f080 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
2f090 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
2f0a0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2f0b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2f0c0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
2f0d0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
2f0e0 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
2f0f0 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
2f100 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2f110 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2f120 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
2f130 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
2f140 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
2f150 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
2f160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f170 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2f180 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
2f190 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2f1a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f1b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f1c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
2f1d0 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
2f1e0 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
2f1f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f200 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2f210 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
2f220 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2f230 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
2f240 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
2f250 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2f260 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2f270 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
2f280 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
2f290 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2f2a0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
2f2b0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2f2c0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
2f2d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f2e0 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
2f2f0 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
2f300 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
2f310 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
2f320 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f330 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2f340 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
2f350 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
2f360 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
2f370 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
2f380 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
2f390 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
2f3a0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
2f3b0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
2f3c0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
2f3d0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
2f3e0 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
2f3f0 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
2f400 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
2f410 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
2f420 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
2f430 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
2f440 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
2f450 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
2f460 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
2f470 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
2f480 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
2f490 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
2f4a0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
2f4b0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2f4c0 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
2f4d0 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
2f4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
2f4f0 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
2f500 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
2f510 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2f520 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
2f530 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
2f540 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
2f550 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
2f560 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
2f570 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
2f580 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
2f590 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f5a0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
2f5b0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
2f5c0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
2f5d0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
2f5e0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
2f5f0 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
2f600 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
2f610 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
2f620 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
2f630 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
2f640 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
2f650 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
2f660 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
2f670 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
2f680 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
2f690 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
2f6a0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
2f6b0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
2f6c0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
2f6d0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
2f6e0 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
2f6f0 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
2f700 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
2f710 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
2f720 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
2f730 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
2f740 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
2f750 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
2f760 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
2f770 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
2f780 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2f790 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
2f7a0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
2f7b0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
2f7c0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
2f7d0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
2f7e0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
2f7f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f800 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
2f810 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
2f820 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
2f830 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
2f840 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
2f850 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
2f860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f870 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2f880 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
2f890 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
2f8a0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
2f8b0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
2f8c0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
2f8d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2f8e0 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
2f8f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2f900 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
2f910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2f920 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
2f930 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2f940 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2f950 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
2f960 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
2f970 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
2f980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
2f990 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
2f9a0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
2f9b0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
2f9c0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
2f9d0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2f9e0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
2f9f0 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
2fa00 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
2fa10 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
2fa20 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
2fa30 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
2fa40 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
2fa50 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
2fa60 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
2fa70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fa80 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
2fa90 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2faa0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2fab0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2fac0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2fad0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2fae0 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c  here, pMinMax,0,
2faf0 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
2fb00 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2fb10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fb20 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2fb30 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
2fb40 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
2fb50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
2fb60 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
2fb70 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2fb80 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2fb90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fba0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
2fbb0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
2fbc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2fbd0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2fbe0 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29  ered(pWInfo)>0 )
2fbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fc00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fc10 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
2fc20 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
2fc30 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
2fc40 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2fc50 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
2fc60 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
2fc70 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
2fc80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2fc90 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
2fca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fcb0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2fcc0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2fcd0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2fce0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2fcf0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2fd00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
2fd10 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2fd20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2fd30 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2fd40 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
2fd50 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
2fd60 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2fd70 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2fd80 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2fd90 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdb0 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
2fdc0 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
2fdd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2fde0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2fdf0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
2fe00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2fe10 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
2fe20 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
2fe30 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
2fe40 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
2fe50 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2fe60 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
2fe70 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
2fe80 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
2fe90 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
2fea0 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
2feb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
2fec0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
2fed0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
2fee0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
2fef0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
2ff00 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
2ff10 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
2ff20 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
2ff30 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2ff40 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
2ff50 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2ff60 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f  sSort.nOBSat>0 ?
2ff70 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20   "RIGHT PART OF 
2ff80 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52  ORDER BY":"ORDER
2ff90 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
2ffa0 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
2ffb0 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70  se, p, &sSort, p
2ffc0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
2ffd0 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
2ffe0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
2fff0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
30000 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
30010 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
30020 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
30030 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
30040 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
30050 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
30060 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
30070 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
30080 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
30090 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
300a0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
300b0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
300c0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
300d0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
300e0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
300f0 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
30100 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
30110 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
30120 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
30130 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
30140 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
30150 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
30160 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
30170 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
30180 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
30190 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
301a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
301b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
301c0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
301d0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
301e0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
301f0 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
30200 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
30210 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
30220 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
30230 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
30240 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20  nfo.aFunc);.#if 
30250 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
30260 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
30270 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
30280 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  nd processing\n"
30290 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  ));.  pParse->nS
302a0 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23  electIndent--;.#
302b0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
302c0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
302d0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
302e0 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
302f0 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69  -readable descri
30300 70 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53  ption of a the S
30310 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
30320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
30330 65 56 69 65 77 53 65 6c 65 63 74 28 54 72 65 65  eViewSelect(Tree
30340 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e  View *pView, con
30350 73 74 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 38  st Select *p, u8
30360 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a   moreToFollow){.
30370 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 70    int n = 0;.  p
30380 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
30390 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
303a0 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
303b0 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
303c0 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53  ewLine(pView, "S
303d0 45 4c 45 43 54 25 73 25 73 22 2c 0a 20 20 20 20  ELECT%s%s",.    
303e0 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ((p->selFlags & 
303f0 53 46 5f 44 69 73 74 69 6e 63 74 29 20 3f 20 22  SF_Distinct) ? "
30400 20 44 49 53 54 49 4e 43 54 22 20 3a 20 22 22 29   DISTINCT" : "")
30410 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c  ,.    ((p->selFl
30420 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
30430 74 65 29 20 3f 20 22 20 61 67 67 5f 66 6c 61 67  te) ? " agg_flag
30440 22 20 3a 20 22 22 29 0a 20 20 29 3b 0a 20 20 69  " : "").  );.  i
30450 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
30460 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 20 6e 2b  >pSrc->nSrc ) n+
30470 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  +;.  if( p->pWhe
30480 72 65 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20  re ) n++;.  if( 
30490 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 6e 2b  p->pGroupBy ) n+
304a0 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76  +;.  if( p->pHav
304b0 69 6e 67 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28  ing ) n++;.  if(
304c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 6e   p->pOrderBy ) n
304d0 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69  ++;.  if( p->pLi
304e0 6d 69 74 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28  mit ) n++;.  if(
304f0 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20 6e 2b   p->pOffset ) n+
30500 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  +;.  if( p->pPri
30510 6f 72 20 29 20 6e 2b 2b 3b 0a 20 20 73 71 6c 69  or ) n++;.  sqli
30520 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c  te3TreeViewExprL
30530 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 45  ist(pView, p->pE
30540 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22  List, (n--)>0, "
30550 72 65 73 75 6c 74 2d 73 65 74 22 29 3b 0a 20 20  result-set");.  
30560 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
30570 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
30580 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
30590 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
305a0 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
305b0 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
305c0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
305d0 69 6e 65 28 70 56 69 65 77 2c 20 22 46 52 4f 4d  ine(pView, "FROM
305e0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
305f0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
30600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
30610 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
30620 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
30630 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
30640 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 20   StrAccum x;.   
30650 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30     char zLine[10
30660 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0];.      sqlite
30670 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
30680 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28  , zLine, sizeof(
30690 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20  zLine), 0);.    
306a0 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
306b0 28 26 78 2c 20 30 2c 20 22 7b 25 64 2c 2a 7d 22  (&x, 0, "{%d,*}"
306c0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
306d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
306e0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 29 7b  em->zDatabase ){
306f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30700 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22  XPrintf(&x, 0, "
30710 20 25 73 2e 25 73 22 2c 20 70 49 74 65 6d 2d 3e   %s.%s", pItem->
30720 7a 44 61 74 61 62 61 73 65 2c 20 70 49 74 65 6d  zDatabase, pItem
30730 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
30740 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
30750 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
30760 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
30770 28 26 78 2c 20 30 2c 20 22 20 25 73 22 2c 20 70  (&x, 0, " %s", p
30780 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
30790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
307a0 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
307b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
307c0 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 74  rintf(&x, 0, " t
307d0 61 62 6e 61 6d 65 3d 25 51 22 2c 20 70 49 74 65  abname=%Q", pIte
307e0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  m->pTab->zName);
307f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30800 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
30810 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30820 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30  te3XPrintf(&x, 0
30830 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49  , " (AS %s)", pI
30840 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
30850 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30860 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pItem->jointype 
30870 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
30880 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
30890 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 4c 45 46  ntf(&x, 0, " LEF
308a0 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20  T-JOIN");.      
308b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
308c0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78  trAccumFinish(&x
308d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
308e0 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
308f0 65 77 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 2d 3e  ew, zLine, i<p->
30900 70 53 72 63 2d 3e 6e 53 72 63 2d 31 29 3b 20 0a  pSrc->nSrc-1); .
30910 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
30920 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
30930 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30940 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c  iewSelect(pView,
30950 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
30960 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
30970 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30980 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
30990 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54    }.    sqlite3T
309a0 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
309b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
309c0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
309d0 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
309e0 6d 28 70 56 69 65 77 2c 20 22 57 48 45 52 45 22  m(pView, "WHERE"
309f0 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
30a00 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
30a10 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 57  xpr(pView, p->pW
30a20 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  here, 0);.    sq
30a30 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
30a40 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
30a50 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
30a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
30a70 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
30a80 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  iew, p->pGroupBy
30a90 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55  , (n--)>0, "GROU
30aa0 50 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  PBY");.  }.  if(
30ab0 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
30ac0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30ad0 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 48  ewItem(pView, "H
30ae0 41 56 49 4e 47 22 2c 20 28 6e 2d 2d 29 3e 30 29  AVING", (n--)>0)
30af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
30b00 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
30b10 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 3b   p->pHaving, 0);
30b20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30b30 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
30b40 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
30b50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
30b60 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
30b70 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70  List(pView, p->p
30b80 4f 72 64 65 72 42 79 2c 20 28 6e 2d 2d 29 3e 30  OrderBy, (n--)>0
30b90 2c 20 22 4f 52 44 45 52 42 59 22 29 3b 0a 20 20  , "ORDERBY");.  
30ba0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  }.  if( p->pLimi
30bb0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
30bc0 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
30bd0 65 77 2c 20 22 4c 49 4d 49 54 22 2c 20 28 6e 2d  ew, "LIMIT", (n-
30be0 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
30bf0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
30c00 56 69 65 77 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  View, p->pLimit,
30c10 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
30c20 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
30c30 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  w);.  }.  if( p-
30c40 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
30c50 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49  sqlite3TreeViewI
30c60 74 65 6d 28 70 56 69 65 77 2c 20 22 4f 46 46 53  tem(pView, "OFFS
30c70 45 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20  ET", (n--)>0);. 
30c80 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30c90 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
30ca0 3e 70 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  >pOffset, 0);.  
30cb0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30cc0 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
30cd0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
30ce0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
30cf0 61 72 20 2a 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e  ar *zOp = "UNION
30d00 22 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ";.    switch( p
30d10 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
30d20 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
30d30 20 20 20 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 20     zOp = "UNION 
30d40 41 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ALL";  break;.  
30d50 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
30d60 52 53 45 43 54 3a 20 20 20 7a 4f 70 20 3d 20 22  RSECT:   zOp = "
30d70 49 4e 54 45 52 53 45 43 54 22 3b 20 20 62 72 65  INTERSECT";  bre
30d80 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
30d90 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 20 20 7a  K_EXCEPT:      z
30da0 4f 70 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20  Op = "EXCEPT";  
30db0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30dc0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30dd0 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a  iewItem(pView, z
30de0 4f 70 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20  Op, (n--)>0);.  
30df0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30e00 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
30e10 2d 3e 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  ->pPrior, 0);.  
30e20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30e30 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
30e40 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
30e50 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a  ewPop(pView);.}.
30e60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30e70 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.