/ Hex Artifact Content
Login

Artifact 6e7d7a277307ebee1a284d8811a8a3351ffc39b2:


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 6e 52 65 73 75  .    for(i=nResu
6270: 6c 74 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  ltCol-1; i>=0; i
6280: 2d 2d 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  --){.      sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
62a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
62b0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
62c0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
62d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
62e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
62f0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6300: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6310: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6320: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6330: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6340: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6350: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6360: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6370: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6380: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6390: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
63a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
63b0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
63c0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
63d0: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
63e0: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
63f0: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
6400: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
6410: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
6420: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
6430: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6440: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6450: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6460: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6470: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6480: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6490: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
64a0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
64b0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
64c0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
64d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
64e0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
64f0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6500: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6510: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6520: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6530: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6550: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6560: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6570: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6580: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6590: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
65a0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
65b0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
65c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
65d0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
65e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
65f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6600: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6610: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6620: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6630: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6640: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6650: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6660: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6670: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6680: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6690: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
66a0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
66b0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
66c0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
66d0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
66e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
66f0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6700: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6710: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6720: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6730: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6740: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6750: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6760: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6770: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6780: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6790: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
67a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67b0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
67c0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
67d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
67f0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6800: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6810: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6820: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6830: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6840: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6850: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6860: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6870: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6880: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6890: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
68a0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
68c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
68d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
68e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
68f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6910: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6940: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6950: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6960: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6970: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6980: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
69c0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
69d0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
69e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
69f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6a10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6a20: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6a30: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6a40: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6a50: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6a60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a70: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6a80: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6a90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6ab0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6ac0: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6ad0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6af0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6b00: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6b10: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6b20: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6b40: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6b50: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6b60: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6b70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6b80: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6b90: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6bc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6bd0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6be0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6bf0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6c00: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6c10: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6c20: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6c30: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6c40: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6c50: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6c80: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
6c90: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
6ca0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6cb0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
6cc0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
6cd0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
6ce0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
6cf0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
6d00: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
6d10: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
6d20: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
6d30: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
6d40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6d50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
6d70: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
6d80: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
6d90: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6da0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
6dd0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
6de0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
6df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6e20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
6e30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6e40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
6e50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
6e70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
6e80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
6e90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
6ea0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
6eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
6ec0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
6ed0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
6ee0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
6ef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6f00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
6f10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
6f20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
6f50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
6f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
6f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6f90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6fa0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
6fb0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
6fc0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
6fd0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
6fe0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6ff0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7000: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7010: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7020: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7030: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7040: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7050: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7060: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7070: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7080: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7090: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
70a0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
70b0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
70c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70f0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7100: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7110: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7120: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
7130: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7140: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
7150: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
7160: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7170: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7180: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7190: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
71a0: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
71b0: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
71c0: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
71d0: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
71e0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
71f0: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7200: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7210: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7220: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7230: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
7240: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
7250: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
7260: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7270: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7280: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
72a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
72b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72c0: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
72d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
72e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
72f0: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7300: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
7310: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7330: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7340: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
7350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7360: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
7370: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
7380: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7390: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
73a0: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
73b0: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
73c0: 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  eg, 1, nPrefixRe
73d0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
73f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7400: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7430: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7460: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7470: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7490: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
74a0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
74b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
74c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
74d0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
74e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
74f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7500: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
7510: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
7520: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7540: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
7550: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7560: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7570: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7580: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7590: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
75a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
75b0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
75c0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
75d0: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
75e0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
75f0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
7600: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
7610: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
7620: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7630: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7640: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
7650: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7670: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7680: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7690: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
76a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
76b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
76c0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
76d0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
76e0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
76f0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
7700: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
7710: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
7720: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
7730: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
7740: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
7750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7760: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7770: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7780: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7790: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
77a0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
77b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
77c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
77d0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
77e0: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
77f0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7810: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7820: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7840: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7850: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7860: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7870: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7880: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7890: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
78a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
78b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
78c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
78e0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
78f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7900: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7910: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7940: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7950: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7960: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7970: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7980: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7990: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
79a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
79b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
79c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
79d0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
79e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
79f0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7a00: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7a30: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7a40: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7a50: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7a60: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7a70: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7a80: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7a90: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7aa0: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7ab0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7ac0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7ad0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7ae0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7af0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7b00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7b10: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7b20: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7b30: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7b40: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50  regResult, 1, nP
7b50: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
7b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b70: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
7b80: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
7b90: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7ba0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
7bb0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
7bc0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7bf0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
7c00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
7c10: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
7c20: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
7c30: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
7c40: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
7c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
7c60: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
7c70: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
7c80: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
7c90: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7ca0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7cc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7cd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7ce0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7d00: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7d10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7d20: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
7d30: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
7d40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
7d50: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
7d80: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
7d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
7da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
7dd0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7de0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
7df0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7e00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7e10: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
7e20: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7e30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e40: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7e60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7e70: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
7e80: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
7e90: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
7ea0: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
7eb0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
7ec0: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
7ed0: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
7ee0: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
7ef0: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
7f00: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
7f10: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
7f20: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
7f30: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
7f40: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
7f50: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
7f60: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
7f70: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
7f80: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
7f90: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
7fa0: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
7fb0: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
7fc0: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
7fd0: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
7fe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7ff0: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8000: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8010: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8020: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8030: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
8040: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
8050: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8060: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
8070: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8090: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
80a0: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
80b0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
80d0: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
80e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
80f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8100: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8110: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8120: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8130: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8140: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
8150: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8160: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8170: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8180: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8190: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
81a0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
81b0: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
81c0: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
81d0: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
81e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
81f0: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8200: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8210: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8220: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8230: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 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 20 20                  
8260: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8270: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8280: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
82a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82b0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
82c0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
82d0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
82e0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
82f0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8300: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8310: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8320: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8330: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
8340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8360: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
8370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
8390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
83a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83b0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
83e0: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
83f0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
8400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8410: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
8420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8440: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
8450: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
8460: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
8470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8480: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
8490: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
84a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
84b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
84c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
84d0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
84e0: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
84f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8500: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8510: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8530: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8540: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8550: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8560: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8570: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8590: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
85a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
85b0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
85c0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
85d0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
85e0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
85f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8600: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8610: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8620: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8630: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8640: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8650: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8660: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8670: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8680: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8690: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
86a0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
86b0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
86c0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
86d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
86e0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
86f0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8710: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8720: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8730: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8740: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8750: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8760: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8770: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8780: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8790: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
87a0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
87b0: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
87c0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
87d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
87e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
87f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
8800: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
8810: 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f  eak, -1); VdbeCo
8820: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
8830: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
8840: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8850: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
8860: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
8870: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
8880: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
8890: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
88a0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
88b0: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
88c0: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
88d0: 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71   KeyInfo *p = sq
88e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
88f0: 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  o(0, .          
8900: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
8910: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29  KeyInfo) + (N+X)
8920: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
8930: 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20  *)+1));.  if( p 
8940: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
8950: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
8960: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
8970: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
8980: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
8990: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
89a0: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
89b0: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
89c0: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
89d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
89e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
89f0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
8a00: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
8a10: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
8a20: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
8a30: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
8a40: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
8a50: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
8a60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
8a70: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
8a80: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
8a90: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
8aa0: 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29  ite3DbFree(0, p)
8ab0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
8ac0: 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ake a new pointe
8ad0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f  r to a KeyInfo o
8ae0: 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  bject.*/.KeyInfo
8af0: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
8b00: 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  Ref(KeyInfo *p){
8b10: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8b20: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
8b30: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
8b40: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
8b50: 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   p;.}..#ifdef SQ
8b60: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
8b70: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
8b80: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8b90: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20   can be change. 
8ba0: 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   The KeyInfo obj
8bb0: 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20  ect.** can only 
8bc0: 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  be changed if th
8bd0: 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e  is is just a sin
8be0: 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  gle reference to
8bf0: 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   the object..**.
8c00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8c10: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73  is used only ins
8c20: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
8c30: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
8c40: 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  nt sqlite3KeyInf
8c50: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79  oIsWriteable(Key
8c60: 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e  Info *p){ return
8c70: 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23   p->nRef==1; }.#
8c80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8c90: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
8ca0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
8cb0: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
8cc0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
8cd0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
8ce0: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
8cf0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
8d00: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
8d10: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
8d20: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8d30: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
8d40: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
8d50: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
8d60: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
8d70: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
8d80: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
8d90: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
8da0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
8db0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
8dc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
8dd0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
8de0: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
8df0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
8e00: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
8e10: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
8e20: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
8e30: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
8e40: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
8e50: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
8e60: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
8e70: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
8e80: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
8e90: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8ea0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
8eb0: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
8ec0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
8ed0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
8ee0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
8ef0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8f00: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
8f10: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
8f20: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
8f30: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
8f40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8f50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8f60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8f70: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8f80: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
8f90: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
8fa0: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
8fb0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
8fc0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
8fd0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
8fe0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
8ff0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
9000: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9010: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
9020: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
9030: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
9040: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
9050: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
9060: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9070: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
9080: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9090: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
90a0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
90b0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
90c0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
90d0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78  oc(db, nExpr+nEx
90e0: 74 72 61 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a  tra-iStart, 1);.
90f0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
9100: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9110: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9120: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
9130: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
9140: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
9150: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
9160: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9170: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9180: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
9190: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
91a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
91b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
91c0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
91d0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
91e0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
91f0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9200: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
9210: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
9220: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
9230: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
9240: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
9250: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
9260: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9270: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9280: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
9290: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
92a0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
92b0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
92c0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
92d0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
92e0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
92f0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
9300: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
9310: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
9320: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
9330: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9340: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9350: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9360: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9370: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9380: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9390: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
93a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
93b0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
93c0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
93d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
93e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
93f0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
9400: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
9410: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9420: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e  EXPLAIN./*.** Un
9430: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9440: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9450: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9460: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9470: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9480: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9490: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
94a0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
94b0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
94c0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
94d0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68  caption is of th
94e0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
94f0: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
9500: 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20   FOR xxx".**.** 
9510: 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65  where xxx is one
9520: 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20   of "DISTINCT", 
9530: 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47  "ORDER BY" or "G
9540: 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c  ROUP BY". Exactl
9550: 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65  y which.** is de
9560: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
9570: 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e  zUsage argument.
9580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9590: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
95a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
95b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61  const char *zUsa
95c0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  ge){.  if( pPars
95d0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
95e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
95f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9600: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
9610: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
9620: 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54  arse->db, "USE T
9630: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
9640: 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20  s", zUsage);.   
9650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9660: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9670: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9680: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
9690: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
96a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  }.}../*.** Assig
96b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
96c0: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
96d0: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
96e0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
96f0: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
9700: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
9710: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
9720: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
9730: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
9740: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
9750: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
9760: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
9770: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
9780: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
9790: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
97a0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
97b0: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
97c0: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
97d0: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
97e0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
97f0: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
9800: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
9810: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
9820: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
9830: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
9840: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
9850: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
9860: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9870: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
9880: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9890: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
98a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
98b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
98c0: 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65  _EXPLAIN) && !de
98d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
98e0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
98f0: 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  T)./*.** Unless 
9900: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
9910: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9920: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9930: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9940: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9950: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9960: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9970: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
9980: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
9990: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
99a0: 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  on is of one of 
99b0: 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a  the two forms:.*
99c0: 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  *.**   "COMPOSIT
99d0: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
99e0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70  b1 and iSub2 (op
99f0: 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  )".**   "COMPOSI
9a00: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
9a10: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53  ub1 and iSub2 US
9a20: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
9a30: 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  (op)".**.** wher
9a40: 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  e iSub1 and iSub
9a50: 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  2 are the intege
9a60: 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  rs passed as the
9a70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
9a80: 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  * function param
9a90: 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73  eters, and op is
9aa0: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
9ab0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
9ac0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
9ad0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54  the same name. T
9ae0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70  he parameter "op
9af0: 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  " must be one of
9b00: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9b10: 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45  CEPT,.** TK_INTE
9b20: 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e  RSECT or TK_ALL.
9b30: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
9b40: 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d  is used if argum
9b50: 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a  ent bUseTmp is .
9b60: 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65  ** false, or the
9b70: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20   second form if 
9b80: 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  it is true..*/.s
9b90: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
9ba0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50  inComposite(.  P
9bb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
9be0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 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 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
9c10: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
9c20: 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  PT etc. */.  int
9c30: 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20   iSub1,         
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c50: 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f  Subquery id 1 */
9c60: 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20  .  int iSub2,   
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
9c90: 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73  d 2 */.  int bUs
9ca0: 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  eTmp            
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9cc0: 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65   if a temp table
9cd0: 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a   was used */.){.
9ce0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
9cf0: 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  _UNION || op==TK
9d00: 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
9d10: 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f  K_INTERSECT || o
9d20: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69  p==TK_ALL );.  i
9d30: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
9d40: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
9d50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9d60: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
9d70: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
9d80: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
9d90: 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50  Parse->db, "COMP
9da0: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
9db0: 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29  %d AND %d %s(%s)
9dc0: 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  ", iSub1, iSub2,
9dd0: 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70  .        bUseTmp
9de0: 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  ?"USING TEMP B-T
9df0: 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74  REE ":"", select
9e00: 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29  OpName(op).    )
9e10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9e20: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
9e30: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
9e40: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
9e50: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
9e60: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f  );.  }.}.#else./
9e70: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9e80: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
9e90: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
9ea0: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
9eb0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f  define explainCo
9ec0: 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c  mposite(v,w,x,y,
9ed0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
9ee0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
9ef0: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
9f00: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
9f10: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
9f20: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
9f30: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
9f40: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
9f50: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
9f60: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
9f70: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
9f80: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
9f90: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
9fa0: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
9fb0: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
9fc0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
9fd0: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
9fe0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
9ff0: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
a000: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
a010: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a020: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a030: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
a040: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
a050: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
a060: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
a070: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
a080: 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  n on the ORDER B
a090: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
a0a0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
a0b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
a0c0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
a0d0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
a0e0: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
a0f0: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
a100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
a110: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a120: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
a130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a140: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a150: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ent */.  int add
a160: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
a170: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
a180: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
a190: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
a1a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
a1b0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
a1c0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a1d0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
a1e0: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
a1f0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
a200: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
a210: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
a220: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
a230: 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  y = pSort->pOrde
a240: 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74  rBy;.  int eDest
a250: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
a260: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
a270: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20  Dest->iSDParm;. 
a280: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
a290: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69  nt regRowid;.  i
a2a0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  nt nKey;.  int i
a2b0: 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20  SortTab;        
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
a2d0: 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72  rter cursor to r
a2e0: 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
a2f0: 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20  t nSortData;    
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a310: 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73   Trailing values
a320: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f   to read from so
a330: 72 74 65 72 20 2a 2f 0a 20 20 75 38 20 70 35 3b  rter */.  u8 p5;
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 35 20            /* p5 
a360: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 31 73  parameter for 1s
a370: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 20  t OP_Column */. 
a380: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
a390: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
a3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a3b0: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
a3c0: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
a3d0: 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53   no. */.#ifdef S
a3e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
a3f0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
a400: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a410: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
a420: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e  ->pEList->a;.#en
a430: 64 69 66 0a 0a 20 20 69 66 28 20 70 53 6f 72 74  dif..  if( pSort
a440: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
a450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a460: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
a470: 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  b, pSort->regRet
a480: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  urn, pSort->labe
a490: 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  lBkOut);.    sql
a4a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a4b0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
a4c0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71  drBreak);.    sq
a4d0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a4e0: 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e  Label(v, pSort->
a4f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d  labelBkOut);.  }
a500: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
a510: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
a520: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
a530: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
a540: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
a550: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
a560: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65      regRow = pDe
a570: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e  st->iSdst;.    n
a580: 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75  SortData = nColu
a590: 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mn;.  }else{.   
a5a0: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
a5b0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5c0: 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f  arse);.    regRo
a5d0: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
a5e0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a5f0: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 31     nSortData = 1
a600: 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70  ;.  }.  nKey = p
a610: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d  OrderBy->nExpr -
a620: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
a630: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
a640: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
a650: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
a660: 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75     int regSortOu
a670: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
a680: 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  em;.    iSortTab
a690: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
a6a0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  +;.    if( pSort
a6b0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
a6c0: 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d        addrOnce =
a6d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
a6e0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
a6f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
a700: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a710: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
a720: 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61  nPseudo, iSortTa
a730: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e  b, regSortOut, n
a740: 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29  Key+1+nSortData)
a750: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e  ;.    if( addrOn
a760: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
a770: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a780: 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20  Once);.    addr 
a790: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a7a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a7b0: 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20  rterSort, iTab, 
a7c0: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
a7d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a7e0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
a7f0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
a800: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
a810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a820: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
a830: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
a840: 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 70 35 20  ortOut);.    p5 
a850: 3d 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  = OPFLAG_CLEARCA
a860: 43 48 45 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  CHE;.    bSeq = 
a870: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
a880: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a890: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a8a0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
a8b0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
a8c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a8d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a8e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a8f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
a900: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
a910: 20 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 62 53    p5 = 0;.    bS
a920: 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  eq = 1;.  }.  fo
a930: 72 28 69 3d 6e 53 6f 72 74 44 61 74 61 2d 31 3b  r(i=nSortData-1;
a940: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
a950: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a960: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a970: 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b   iSortTab, nKey+
a980: 62 53 65 71 2b 69 2c 20 72 65 67 52 6f 77 2b 69  bSeq+i, regRow+i
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
a9b0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
a9c0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75  nt((v, "%s", aOu
a9d0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61  tEx[i].zName ? a
a9e0: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a  OutEx[i].zName :
a9f0: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e   aOutEx[i].zSpan
aa00: 29 29 3b 0a 20 20 20 20 70 35 20 3d 20 30 3b 0a  ));.    p5 = 0;.
aa10: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
aa20: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
aa30: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
aa40: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
aa50: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
aa60: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
aa70: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
aa80: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
aa90: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
aaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aab0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
aac0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
aad0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
aae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
aaf0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
ab00: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
ab10: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
ab20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ab30: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
ab40: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
ab50: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ab60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ab70: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
ab80: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
ab90: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
aba0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
abb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
abc0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
abd0: 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f  regRow, 1, regRo
abe0: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 44               &pD
ac00: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
ac10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ac20: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
ac30: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
ac40: 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20  egRow, 1);.     
ac50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac60: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
ac70: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
ac80: 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  wid);.      brea
ac90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
aca0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
acb0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
acc0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
acd0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
ace0: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ve(pParse, regRo
acf0: 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  w, iParm, 1);.  
ad00: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
ad10: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
ad20: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
ad30: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
ad40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
ad50: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
ad60: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
ad70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ad80: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ad90: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
ada0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
adb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
adc0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
add0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
ade0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
adf0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
ae00: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
ae10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae20: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ae30: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
ae40: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
ae50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ae60: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ae70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
ae80: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
ae90: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
aea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aeb0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
aec0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
aed0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
aee0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
aef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
af00: 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73  egRowid ){.    s
af10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
af20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
af30: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
af40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
af50: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
af60: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
af70: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
af80: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
af90: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
afa0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
afb0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
afc0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
afd0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
afe0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
aff0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b000: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
b010: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
b020: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
b030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b040: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b050: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
b060: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
b080: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
b090: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b0a0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
b0b0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
b0c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
b0d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
b0e0: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
b0f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
b100: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
b110: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b120: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
b130: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
b140: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
b150: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
b160: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
b170: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
b180: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
b190: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b1a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
b1b0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
b1c0: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
b1d0: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
b1e0: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
b1f0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b200: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
b210: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
b220: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b230: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
b240: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b250: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
b260: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
b270: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
b280: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
b290: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
b2a0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
b2b0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
b2c0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
b2d0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
b2e0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
b2f0: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
b300: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
b310: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
b320: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
b330: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
b340: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
b350: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
b360: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
b370: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b380: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
b390: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b3a0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b3b0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b3c0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
b3d0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
b3e0: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
b3f0: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
b400: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
b410: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
b420: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
b430: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
b440: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
b450: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
b460: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
b470: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
b480: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
b490: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
b4a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
b4b0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
b4c0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b4d0: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
b4e0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
b4f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
b500: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b510: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
b520: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b530: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b540: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
b550: 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  D,E,F).static co
b560: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
b570: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
b580: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
b590: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
b5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b5b0: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
b5c0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
b5d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
b5e0: 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20  pzOrigCol,.  u8 
b5f0: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
b600: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b610: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
b620: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
b630: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b640: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
b650: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65  .#else /* if !de
b660: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b670: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b680: 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ATA) */.# define
b690: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b6a0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b6b0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73  ypeImpl(A,B,F).s
b6c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b6d0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
b6e0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
b6f0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
b700: 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74  Expr,.  u8 *pEst
b710: 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20  Width.){.#endif 
b720: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b730: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b740: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20  _METADATA) */.  
b750: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
b760: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
b770: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
b780: 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  1;..  if( NEVER(
b790: 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43  pExpr==0) || pNC
b7a0: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
b7b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
b7c0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
b7d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
b7e0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
b7f0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
b800: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b810: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b820: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
b830: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
b840: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
b850: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
b860: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
b870: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
b880: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
b890: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
b8a0: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
b8b0: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
b8c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
b8d0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
b8e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
b8f0: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
b900: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
b910: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
b920: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
b930: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
b940: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
b950: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
b960: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
b970: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
b980: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
b990: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
b9a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b9b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
b9c0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b9d0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
b9e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
b9f0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
ba00: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
ba10: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
ba20: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
ba30: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
ba40: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
ba50: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
ba60: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
ba70: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
ba80: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
ba90: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
baa0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
bab0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
bac0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
bad0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
bae0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
baf0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
bb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bb10: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
bb20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
bb40: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
bb50: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
bb60: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
bb70: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
bb80: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
bb90: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
bba0: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
bbb0: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
bbc0: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
bbd0: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
bbe0: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
bbf0: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
bc00: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
bc10: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
bc20: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
bc30: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
bc40: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
bc50: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
bc60: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
bc70: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
bc80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
bc90: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bca0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
bcb0: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
bcc0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
bcd0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
bce0: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
bcf0: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
bd00: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
bd10: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
bd20: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
bd30: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
bd40: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
bd50: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
bd60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
bd70: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
bd80: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
bd90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
bda0: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
bdb0: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
bdc0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
bdd0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
bde0: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
bdf0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
be00: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
be10: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
be20: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
be30: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
be40: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
be50: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
be60: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
be70: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
be80: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
be90: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
bea0: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
beb0: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
bec0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
bed0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
bee0: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
bef0: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
bf00: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
bf10: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
bf20: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
bf30: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
bf40: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
bf50: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
bf60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
bf70: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
bf80: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
bf90: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfa0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
bfb0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
bfc0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
bfd0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
bfe0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
bff0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c000: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41   iCol>=0 && ALWA
c010: 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  YS(iCol<pS->pELi
c020: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
c030: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
c040: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
c050: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
c060: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
c070: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
c080: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
c090: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
c0a0: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
c0b0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
c0c0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
c0d0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
c0e0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
c0f0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
c100: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
c110: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
c120: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c130: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
c140: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c150: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c160: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c170: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c180: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c190: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c1a0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c1b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c1c0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c1d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c1e0: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c1f0: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c200: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c220: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c230: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c240: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c250: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c260: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c270: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c280: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c290: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c2a0: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c2b0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c2c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c2d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c2e0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c2f0: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c300: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c310: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c320: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c330: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c340: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c360: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c370: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c380: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c390: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c3a0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c3b0: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c3c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c3d0: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c3e0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c3f0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c400: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c410: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c420: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c430: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c440: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c450: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c460: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c470: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c480: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c490: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c4a0: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c4b0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c4c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c4d0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c4e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c4f0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c500: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c510: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c520: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c530: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c540: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c550: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c570: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c580: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c590: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c5a0: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c5b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c5c0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c5d0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c5e0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c5f0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c600: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c610: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c620: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c630: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c640: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c650: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c660: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c670: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c680: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c690: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c6a0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c6b0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c6c0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c6d0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c6e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c6f0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c700: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c710: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c720: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c730: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c740: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c750: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c760: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c770: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c780: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c790: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c7a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c7b0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c7c0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c7d0: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c7e0: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c7f0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c800: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c810: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c820: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c830: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c840: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c850: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c860: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c870: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c880: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c890: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c8a0: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c8b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c8c0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c8d0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c8e0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c8f0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c900: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c910: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c920: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c940: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c950: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c960: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c970: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c980: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
c990: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
c9a0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
c9b0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
c9c0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
c9d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
c9e0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
c9f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ca00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
ca10: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
ca20: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
ca30: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
ca40: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
ca50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
ca60: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
ca70: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
ca80: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
ca90: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
caa0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
cab0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cac0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
cad0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cae0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
caf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
cb00: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
cb10: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
cb20: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
cb30: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cb40: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
cb50: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
cb60: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
cb70: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
cb80: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
cb90: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
cba0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
cbb0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
cbc0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
cbd0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
cbe0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
cbf0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cc00: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cc10: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cc20: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cc30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cc40: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
cc50: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
cc60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cc70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cc90: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cca0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
ccb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
ccc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ccd0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cce0: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
ccf0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cd00: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cd10: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cd20: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cd30: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
cd40: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
cd50: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cd60: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
cd70: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
cd80: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cd90: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
cda0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cdb0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
cdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cdd0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cde0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
cdf0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
ce00: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
ce10: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
ce20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
ce30: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
ce40: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
ce50: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
ce60: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
ce70: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
ce80: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
ce90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cea0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
ceb0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
cec0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
ced0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
cee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
cef0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
cf00: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
cf10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cf20: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
cf30: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cf40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
cf50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cf60: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
cf70: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
cf80: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
cf90: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cfa0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
cfb0: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
cfc0: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
cfd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
cfe0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
cff0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
d000: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
d010: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
d020: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
d030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
d040: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
d050: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d060: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d070: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d080: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d090: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d0a0: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d0b0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d0c0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d0d0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d0e0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d0f0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d100: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d110: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d120: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d130: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d140: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d150: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d160: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d170: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d180: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d190: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d1a0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d1b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d1c0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d1d0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d1e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d1f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d200: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d210: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d220: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d230: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d240: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d250: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d260: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d270: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d280: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d290: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d2a0: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d2b0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d2c0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d2d0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d2f0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d300: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d310: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d320: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d330: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d340: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d350: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d360: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d370: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d380: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d390: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d3a0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d3b0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d3d0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d3e0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d3f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d400: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d410: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d430: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d440: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d460: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d470: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d480: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d490: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d4a0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d4c0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d4d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d4e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d4f0: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d500: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d520: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d530: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d540: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d550: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d560: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d570: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d580: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d590: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d5a0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d5b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d5c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d5d0: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d5e0: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d5f0: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d600: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d610: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d620: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d630: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d640: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d650: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d660: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d670: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d680: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d690: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d6a0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d6b0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d6c0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d6d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d6e0: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d6f0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d700: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d710: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d720: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d730: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d740: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d750: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d760: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d770: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d780: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d790: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d7a0: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d7b0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d7c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d7d0: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d7e0: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d7f0: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d800: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d810: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d820: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d840: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d850: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d860: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d870: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d880: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d890: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d8a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
d8c0: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d8d0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d8e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d8f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d900: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d910: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
d920: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
d930: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
d940: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
d950: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
d960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d970: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
d980: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
d990: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
d9a0: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
d9b0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
d9c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
d9d0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d9e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d9f0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
da00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
da10: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da30: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
da40: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da60: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
da70: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
da80: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
da90: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
daa0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
dab0: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
dac0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
dad0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
daf0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
db00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
db10: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
db40: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
db50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
db60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db80: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
db90: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbb0: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
dbc0: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
dbd0: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
dbe0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
dbf0: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
dc00: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
dc10: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
dc20: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
dc30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
dc40: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
dc50: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
dc60: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
dc70: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
dc80: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dc90: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dca0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dcb0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
dcc0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
dcd0: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
dce0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
dcf0: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
dd00: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
dd10: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
dd20: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
dd30: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
dd40: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dd50: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dd60: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dd70: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dd80: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dd90: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dda0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
ddb0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
ddc0: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
ddd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dde0: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
ddf0: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
de00: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
de10: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
de20: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
de30: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
de40: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
de50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
de60: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
de70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
de80: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
de90: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
dea0: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
deb0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
dec0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
ded0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
dee0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
def0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
df00: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
df10: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
df20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
df30: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
df40: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
df50: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
df60: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
df70: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
df80: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
df90: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
dfa0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
dfb0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
dfc0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
dfd0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
dfe0: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e000: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
e010: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
e020: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
e030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e040: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e050: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e060: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e070: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e080: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e090: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
e0a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e0b0: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
e0c0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
e0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e0e0: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
e0f0: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
e100: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
e110: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
e120: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
e130: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e140: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e150: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e160: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e170: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e180: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
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: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e1c0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e1d0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e1e0: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e1f0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e200: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e210: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e220: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e230: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e240: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e250: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e260: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e270: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e280: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e290: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e2a0: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e2b0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e2c0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e2d0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e2e0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e2f0: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e300: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e310: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e320: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e330: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e340: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e350: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e360: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e370: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e380: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e390: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e3a0: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e3b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e3c0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e3d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e3e0: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e3f0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e400: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e410: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e420: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e430: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e440: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e450: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e460: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e470: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e480: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e490: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e4a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e4b0: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e4c0: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e4d0: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e4e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e4f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e520: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e530: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e540: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e550: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e560: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e570: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e580: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e590: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e5a0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e5b0: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e5c0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e5d0: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e5e0: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e5f0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e600: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e610: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e620: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e630: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e640: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e650: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e660: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e670: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e680: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e6a0: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e6b0: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e6c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e6d0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e6e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e6f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e700: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e710: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e720: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e730: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e740: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e750: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e760: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e770: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e780: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e790: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e7a0: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e7b0: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e7c0: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e7d0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e7e0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e7f0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e800: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e810: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e820: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e830: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e840: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e850: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e870: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e880: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e890: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e8a0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e8b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e8c0: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
e8d0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
e8e0: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
e8f0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
e900: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
e910: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e920: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
e930: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
e940: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e950: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
e960: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
e970: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
e980: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
e990: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
e9a0: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
e9b0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
e9c0: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
e9d0: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
e9e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
e9f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
ea00: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
ea10: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
ea20: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
ea30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
ea40: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
ea50: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
ea60: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
ea70: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
ea80: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
ea90: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
eaa0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
eab0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
eac0: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
ead0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
eae0: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
eaf0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
eb00: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
eb10: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
eb20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
eb30: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
eb40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
eb50: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
eb60: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
eb70: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
eb80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
eb90: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
eba0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ebb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ebc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ebd0: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ebe0: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ebf0: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
ec00: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
ec10: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
ec20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ec30: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ec40: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ec50: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ec60: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ec70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ec80: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ec90: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
eca0: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ecb0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ecc0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ecd0: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
ece0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ecf0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
ed00: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ed10: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
ed20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ed30: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
ed40: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ed50: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
ed60: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
ed70: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
ed80: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
ed90: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
eda0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
edb0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
edc0: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
edd0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
ede0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
edf0: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
ee00: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
ee10: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c  048576) );.  sel
ee20: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
ee30: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
ee40: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
ee50: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
ee60: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
ee70: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
ee80: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
ee90: 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
eea0: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
eeb0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
eec0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
eee0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
eef0: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
ef00: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
ef10: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
ef20: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
ef30: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
ef40: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
ef50: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
ef60: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
ef70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
ef80: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
ef90: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
efa0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
efb0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
efc0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
efd0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
efe0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
eff0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
f000: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f010: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
f020: 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  eate(pParse);.  
f030: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
f040: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
f050: 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  P_Init);.    if(
f060: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
f070: 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  el==0.     && Op
f080: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
f090: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c  d(pParse->db,SQL
f0a0: 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
f0b0: 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  st).    ){.     
f0c0: 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
f0d0: 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20  Factor = 1;.    
f0e0: 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  }..  }.  return 
f0f0: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
f100: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
f110: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
f120: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
f130: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
f140: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f150: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
f160: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
f170: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
f180: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
f190: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
f1a0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
f1b0: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
f1c0: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
f1d0: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
f1e0: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
f1f0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
f200: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
f210: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
f220: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
f230: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
f240: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
f250: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
f260: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
f270: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
f280: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
f290: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
f2a0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
f2b0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
f2c0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
f2d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f2e0: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
f2f0: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
f300: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
f310: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
f320: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
f330: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
f340: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
f350: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
f360: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
f370: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
f380: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
f390: 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72  ues (zero).** pr
f3a0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
f3b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
f3c0: 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72  ** The iOffset r
f3d0: 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65  egister (if it e
f3e0: 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61  xists) is initia
f3f0: 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
f400: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46  ue.** of the OFF
f410: 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74  SET.  The iLimit
f420: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
f430: 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
f440: 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20  T.  Register.** 
f450: 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69  iOffset+1 is ini
f460: 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
f470: 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  T+OFFSET..**.** 
f480: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
f490: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
f4a0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
f4b0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
f4c0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
f4d0: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
f4e0: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
f4f0: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
f500: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
f510: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
f520: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
f530: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
f540: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
f550: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
f560: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
f570: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
f580: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
f590: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
f5a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
f5b0: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
f5c0: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
f5d0: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
f5e0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
f5f0: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
f600: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
f610: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
f620: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
f630: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
f640: 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74  ontroversy about
f650: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
f660: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
f670: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
f680: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
f690: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
f6a0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
f6b0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
f6c0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
f6d0: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
f6e0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
f6f0: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
f700: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
f710: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
f720: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
f730: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
f740: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f750: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f760: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f770: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
f780: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f790: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f7a0: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
f7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f7c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f7d0: 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
f7e0: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
f7f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f800: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
f810: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
f820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
f840: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
f850: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f860: 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c   n>=0 && p->nSel
f870: 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b  ectRow>(u64)n ){
f880: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
f890: 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20  ectRow = n;.    
f8a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f8c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
f8d0: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
f8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
f900: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
f910: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
f920: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
f930: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f940: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
f950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f960: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
f970: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
f980: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
f990: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
f9a0: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
f9b0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
f9c0: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
f9d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f9e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
f9f0: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
fa00: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
fa10: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
fa20: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
fa30: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fa40: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
fa50: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
fa60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa70: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
fa80: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
fa90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
faa0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fab0: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
fac0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
fad0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
fae0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
faf0: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
fb00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fb10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fb30: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
fb40: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
fb50: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fb60: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb80: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
fb90: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
fba0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
fbb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fbc0: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
fbd0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbf0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
fc00: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
fc10: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
fc20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc30: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
fc40: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
fc50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc60: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fc70: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
fc80: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fc90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
fca0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
fcb0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
fcc0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
fcd0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
fce0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
fcf0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
fd00: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
fd10: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
fd20: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
fd30: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
fd40: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
fd50: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
fd60: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
fd70: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
fd80: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fd90: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
fda0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
fdb0: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
fdc0: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
fdd0: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
fde0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
fdf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
fe00: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
fe10: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
fe20: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
fe30: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
fe40: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
fe50: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
fe60: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
fe70: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
fe80: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
fe90: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
fea0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
feb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
fec0: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
fed0: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
fee0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
fef0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
ff00: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
ff10: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
ff20: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
ff30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ff40: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
ff50: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
ff60: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
ff70: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
ff80: 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
ff90: 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
ffa0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
ffb0: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
ffc0: 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
ffd0: 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
ffe0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
fff0: 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
10000 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
10010 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
10020 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
10030 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
10040 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
10050 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
10060 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
10070 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
10080 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
10090 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
100a0 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
100b0 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
100c0 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
100d0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
100e0 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
100f0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
10100 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
10110 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
10120 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10130 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
10140 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
10150 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
10160 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10170 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
10180 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
10190 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
101a0 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
101b0 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
101c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
101d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
101e0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
101f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
10200 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
10210 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
10220 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
10230 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
10240 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
10250 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
10260 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
10270 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
10280 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
10290 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
102a0 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
102b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
102c0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
102d0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
102e0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
102f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
10300 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
10310 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
10320 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
10330 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
10340 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
10350 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
10360 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
10370 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
10380 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
10390 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
103a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
103b0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
103c0 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
103d0 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
103e0 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
103f0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
10400 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
10410 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
10420 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
10430 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
10440 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10450 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
10460 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
10470 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
10480 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
10490 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
104a0 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
104b0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
104c0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
104d0 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
104e0 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
104f0 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
10500 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
10530 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
10540 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
10550 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
105a0 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
105b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
105c0 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
105d0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
105e0 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
105f0 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
10600 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
10610 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72  ist->a[].isRecur
10620 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  sive flag..**.**
10630 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   The setup-query
10640 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65   runs once to ge
10650 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61  nerate an initia
10660 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68  l set of rows th
10670 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20  at go.** into a 
10680 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f  Queue table.  Ro
10690 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ws are extracted
106a0 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20   from the Queue 
106b0 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20  table one by.** 
106c0 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65  one.  Each row e
106d0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
106e0 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f  eue is output to
106f0 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68   pDest.  Then th
10700 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72  e single.** extr
10710 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69  acted row (now i
10720 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74  n the iCurrent t
10730 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68  able) becomes th
10740 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
10750 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61  .** recursive-ta
10760 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73  ble for a recurs
10770 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20  ive-query run.  
10780 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  The output of th
10790 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  e recursive-quer
107a0 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61  y.** is added ba
107b0 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ck into the Queu
107c0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61  e table.  Then a
107d0 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78  nother row is ex
107e0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
107f0 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74  ue.** and the it
10800 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  eration continue
10810 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  s until the Queu
10820 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
10830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
10840 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70  ompound query op
10850 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
10860 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74  then no duplicat
10870 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a  e rows are ever.
10880 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
10890 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
108a0 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74  .  The iDistinct
108b0 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63   table keeps a c
108c0 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a  opy of all rows.
108d0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65  ** that have eve
108e0 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  r been inserted 
108f0 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63  into Queue and c
10900 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73  auses duplicates
10910 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72   to be.** discar
10920 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65  ded.  If the ope
10930 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41  rator is UNION A
10940 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61  LL, then duplica
10950 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  tes are allowed.
10960 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71  .** .** If the q
10970 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45  uery has an ORDE
10980 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69  R BY, then entri
10990 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  es in the Queue 
109a0 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69  table are kept i
109b0 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
109c0 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73  der and the firs
109d0 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61  t entry is extra
109e0 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79  cted for each cy
109f0 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a  cle.  Without.**
10a00 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
10a10 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
10a20 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a   just a FIFO..**
10a30 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63  .** If a LIMIT c
10a40 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65  lause is provide
10a50 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  d, then the iter
10a60 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65  ation stops afte
10a70 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20  r LIMIT rows.** 
10a80 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74  have been output
10a90 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49   to pDest.  A LI
10aa0 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e  MIT of zero mean
10ab0 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72  s to output no r
10ac0 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67  ows and a.** neg
10ad0 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e  ative LIMIT mean
10ae0 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20  s to output all 
10af0 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20  rows.  If there 
10b00 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45  is also an OFFSE
10b10 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68  T clause.** with
10b20 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
10b30 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
10b40 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73  t OFFSET outputs
10b50 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72   are discarded r
10b60 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65  ather.** than be
10b70 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73  ing sent to pDes
10b80 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f  t.  The LIMIT co
10b90 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  unt does not beg
10ba0 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f  in until after O
10bb0 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61  FFSET.** rows ha
10bc0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  ve been skipped.
10bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10be0 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
10bf0 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61  rsiveQuery(.  Pa
10c00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10c10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10c20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10c30 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10c40 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69    /* The recursi
10c50 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20  ve SELECT to be 
10c60 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
10c70 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
10c80 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
10c90 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
10ca0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
10cb0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
10cc0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
10cd0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
10ce0 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
10cf0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  y */.  int nCol 
10d00 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
10d10 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  pr;  /* Number o
10d20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
10d30 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
10d40 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
10d50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
10d60 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
10d70 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
10d80 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10d90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
10da0 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  etup = p->pPrior
10db0 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70  ;   /* The setup
10dc0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10dd0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
10df0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
10e00 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20    int addrCont, 
10e10 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20  addrBreak;      
10e20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20  /* CONTINUE and 
10e30 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20  BREAK addresses 
10e40 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
10e50 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10e60 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e     /* The Curren
10e70 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10e80 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20   regCurrent;    
10e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10ea0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43  gister holding C
10eb0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10ec0 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20    int iQueue;   
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62  /* The Queue tab
10ef0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73  le */.  int iDis
10f00 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20  tinct = 0;      
10f10 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75        /* To ensu
10f20 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74  re unique result
10f30 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20  s if UNION */.  
10f40 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f  int eDest = SRT_
10f50 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Fifo;         /*
10f60 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f   How to write to
10f70 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65   Queue */.  Sele
10f80 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65  ctDest destQueue
10f90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  ;         /* Sel
10fa0 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69  ectDest targetti
10fb0 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62  ng the Queue tab
10fc0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10ff0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11000 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11010 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
11020 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  lt code */.  Exp
11030 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
11040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11050 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11060 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
11070 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20  mit, *pOffset;  
11080 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49       /* Saved LI
11090 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
110a0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
110b0 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20  , regOffset;    
110c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75    /* Registers u
110d0 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64  sed by LIMIT and
110e0 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a   OFFSET */..  /*
110f0 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a   Obtain authoriz
11100 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65  ation to do a re
11110 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
11120 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
11130 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11140 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
11150 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
11160 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  urn;..  /* Proce
11170 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  ss the LIMIT and
11180 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c   OFFSET clauses,
11190 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a   if they exist *
111a0 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20  /.  addrBreak = 
111b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
111c0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
111d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
111e0 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
111f0 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
11200 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
11210 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
11220 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  fset;.  regLimit
11230 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
11240 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
11250 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
11260 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  mit = p->pOffset
11270 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
11280 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
11290 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
112a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
112b0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
112c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
112d0 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
112e0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
112f0 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
11300 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
11310 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  if( pSrc->a[i].i
11320 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
11330 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
11340 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
11350 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
11360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11370 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11380 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
11390 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
113a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
113b0 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
113c0 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
113d0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
113e0 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
113f0 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
11400 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
11410 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
11420 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
11430 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
11440 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
11450 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11460 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
11470 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
11480 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11490 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
114a0 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
114b0 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
114c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
114d0 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
114e0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
114f0 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
11500 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
11510 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
11520 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
11530 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
11540 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
11550 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
11560 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
11570 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
11580 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
11590 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
115a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
115b0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
115c0 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
115d0 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
115e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
115f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11600 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
11610 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
11620 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
11630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11640 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
11650 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
11660 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11670 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
11680 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11690 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
116a0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
116b0 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
116c0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
116d0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
116e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
116f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11700 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
11710 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
11720 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
11730 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
11740 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
11750 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11760 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11770 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11780 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
11790 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
117a0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
117b0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
117c0 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
117d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
117e0 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
117f0 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
11800 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
11810 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
11820 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11830 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
11840 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
11850 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
11860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11870 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
11880 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
11890 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
118a0 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
118b0 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
118c0 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
118d0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
118e0 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
118f0 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
11900 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
11910 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
11920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11930 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
11940 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
11950 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
11960 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
11970 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
11980 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
11990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
119a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
119b0 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
119c0 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
119d0 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
119e0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
119f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a00 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
11a10 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
11a20 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
11a30 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
11a40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11a50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11a60 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
11a70 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
11a80 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11a90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
11aa0 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
11ab0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
11ac0 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11ad0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
11ae0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11af0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
11b00 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
11b10 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
11b20 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
11b30 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11b40 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72  p->pEList, iCurr
11b50 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
11b60 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
11b70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11b80 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
11b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11ba0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
11bb0 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64  ro, regLimit, ad
11bc0 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20  drBreak, -1);.  
11bd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11be0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11bf0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11c00 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
11c10 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
11c20 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
11c30 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
11c40 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
11c50 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
11c60 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
11c70 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
11c80 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11c90 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
11ca0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
11cb0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   0;.  sqlite3Sel
11cc0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
11cd0 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73  destQueue);.  as
11ce0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
11cf0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f  =0 );.  p->pPrio
11d00 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f  r = pSetup;..  /
11d10 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
11d20 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
11d30 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
11d40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11d50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
11d60 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
11d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11d80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11d90 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
11da0 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
11db0 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
11dc0 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
11dd0 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
11de0 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
11df0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
11e00 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
11e10 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  mit;.  p->pOffse
11e20 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72  t = pOffset;.  r
11e30 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11e40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
11e50 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
11e60 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
11e70 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
11e80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
11e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11ea0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11eb0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11ec0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
11ed0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
11ee0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
11ef0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
11f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
11f10 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
11f20 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
11f30 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
11f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11f50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
11f60 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
11f70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
11f80 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
11f90 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
11fa0 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
11fb0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
11fc0 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
11fd0 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
11fe0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
11ff0 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
12000 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
12010 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
12020 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
12030 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
12040 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
12050 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
12060 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
12070 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
12080 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
12090 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
120a0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
120b0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
120c0 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
120d0 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
120e0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
120f0 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
12100 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
12110 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
12120 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
12130 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
12140 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
12150 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
12160 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
12170 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
12180 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
12190 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
121a0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
121b0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
121c0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
121d0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
121e0 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
121f0 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
12200 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
12220 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12230 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
12240 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
12250 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
12260 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
12270 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
12280 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
12290 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
122a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
122b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
122c0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
122d0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
122e0 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
122f0 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
12300 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
12310 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
12320 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
12330 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
12340 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
12350 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
12360 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
12370 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
12380 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
12390 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
123a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
123b0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
123c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
123d0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
123e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
123f0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
12400 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
12410 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
12420 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
12430 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
12440 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
12450 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12460 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
12470 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12480 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
12490 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
124a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
124b0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
124c0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
124d0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
124e0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
124f0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12500 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
12510 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
12520 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
12530 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
12540 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
12550 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
12560 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
12570 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
12580 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
12590 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
125a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
125b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
125c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
125d0 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  n */.#ifndef SQL
125e0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
125f0 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30  .  int iSub1 = 0
12600 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
12610 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
12620 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
12630 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub2 = 0;       
12640 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
12650 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
12660 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  /.#endif..  /* M
12670 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
12680 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
12690 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
126a0 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
126b0 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
126c0 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
126d0 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
126e0 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
126f0 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
12700 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  MIT..  */.  asse
12710 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69  rt( p && p->pPri
12720 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e  or );  /* Callin
12730 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61  g function guara
12740 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20  ntees this much 
12750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  */.  assert( (p-
12760 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12770 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20  ecursive)==0 || 
12780 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
12790 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
127a0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
127b0 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20  e->db;.  pPrior 
127c0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  = p->pPrior;.  d
127d0 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
127e0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
127f0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
12800 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12810 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
12820 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
12830 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
12840 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
12850 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
12860 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
12870 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
12880 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
12890 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
128a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
128b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
128c0 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
128d0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
128e0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
128f0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
12900 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
12910 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
12920 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12930 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
12940 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12950 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
12960 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
12970 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
12980 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
12990 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
129a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
129b0 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
129c0 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
129d0 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
129e0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
129f0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
12a00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12a10 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
12a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12a30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12a40 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
12a50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
12a60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12a70 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
12a80 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
12a90 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
12aa0 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
12ab0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
12ac0 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
12ad0 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
12ae0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
12af0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
12b00 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
12b10 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
12b20 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12b30 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
12b40 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
12b50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
12b60 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
12b70 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
12b80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12b90 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20  Values ){.      
12ba0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12bb0 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
12bc0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
12bd0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
12be0 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65   terms");.    }e
12bf0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
12c00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12c10 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
12c20 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
12c30 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20  t of %s".       
12c40 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
12c50 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
12c60 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
12c70 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
12c80 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20  p->op));.    }. 
12c90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
12ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12cb0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  _end;.  }..#ifnd
12cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
12cd0 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
12ce0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
12cf0 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
12d00 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
12d10 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
12d20 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
12d30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
12d40 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
12d50 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
12d60 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
12d70 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
12d80 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
12d90 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
12da0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
12db0 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
12dc0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
12dd0 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
12de0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
12df0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
12e00 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
12e10 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
12e20 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
12e30 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
12e40 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
12e50 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
12e60 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
12e70 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
12e80 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
12e90 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
12ea0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
12eb0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
12ec0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
12ed0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
12ee0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
12ef0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
12f00 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
12f10 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
12f20 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
12f30 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
12f40 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12f50 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12f60 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
12f70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
12f80 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
12f90 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
12fa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
12fb0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
12fc0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12fd0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
12fe0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
12ff0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
13000 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
13010 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
13020 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
13030 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
13040 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
13050 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
13060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13070 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
13080 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f  >iLimit); VdbeCo
13090 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
130a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
130b0 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
130c0 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
130d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
130e0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
130f0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
13100 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13110 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13120 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13130 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
13140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13160 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
13170 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
13180 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
13190 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ior;.      p->nS
131a0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
131b0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
131c0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
131d0 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
131e0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
131f0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
13200 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29  pLimit, &nLimit)
13210 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69  .       && nLimi
13220 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
13230 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d  tRow > (u64)nLim
13240 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  it .      ){.   
13250 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13260 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  ow = nLimit;.   
13270 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
13280 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ddr ){.        s
13290 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
132a0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
132b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
132c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
132d0 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
132e0 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
132f0 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
13300 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
13310 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
13320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13330 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
13340 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20  /.      u8 op = 
13350 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
13360 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
13370 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
13380 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
13390 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
133a0 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
133b0 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
133c0 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
133d0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
133e0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
133f0 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
13400 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
13410 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
13420 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
13430 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
13440 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
13450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13460 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
13470 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13480 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
13490 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
134a0 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
134b0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
134c0 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
134d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
134e0 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
134f0 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
13500 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
13510 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
13520 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
13530 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
13540 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
13550 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
13560 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
13570 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
13580 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13590 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
135a0 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
135b0 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
135c0 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
135d0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
135e0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
135f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13600 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
13610 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
13620 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
13630 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
13640 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
13650 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
13660 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
13670 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
13680 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13690 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
136a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
136b0 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
136c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
136d0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
136e0 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
136f0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
13700 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
13710 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
13720 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
13730 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
13740 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
13750 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
13760 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
13770 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
13780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13790 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
137a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
137b0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
137c0 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
137d0 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
137e0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
137f0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
13800 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
13810 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
13820 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
13830 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
13840 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13850 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
13860 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13870 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13880 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13890 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
138a0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
138b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
138c0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
138d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
138e0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
138f0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
13900 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
13910 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
13920 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
13930 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
13940 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
13950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13960 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13970 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
13980 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
13990 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
139a0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
139b0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
139c0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
139d0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
139e0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
139f0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
13a00 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
13a10 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
13a20 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
13a30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13a40 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
13a50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13a60 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13a80 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
13a90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
13aa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
13ac0 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
13ad0 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
13ae0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
13af0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
13b00 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
13b10 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
13b20 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
13b30 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
13b40 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
13b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
13b60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
13b70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
13b80 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
13b90 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
13ba0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
13bb0 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
13bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
13bd0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
13be0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
13bf0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
13c00 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
13c10 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
13c20 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
13c30 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
13c40 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
13c50 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
13c60 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
13c70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
13c80 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
13c90 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
13ca0 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
13cb0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
13cc0 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
13cd0 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
13ce0 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
13cf0 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
13d00 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13d10 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
13d20 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
13d30 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
13d40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
13d50 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
13d60 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
13d70 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
13d80 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
13d90 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13da0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
13db0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
13dc0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
13dd0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
13de0 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
13df0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
13e00 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
13e10 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
13e20 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
13e30 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
13e40 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
13e50 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
13e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13e70 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
13e80 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
13e90 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
13ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13eb0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13ec0 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
13ed0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
13ee0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
13ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
13f10 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
13f20 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
13f30 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
13f40 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
13f50 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13f60 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
13f70 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
13f80 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
13f90 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  t, unionTab,.   
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
13fc0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
13fd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13fe0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13ff0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
14000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14020 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
14030 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
14040 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
14050 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14060 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
14070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14090 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
140a0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
140b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
140c0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
140d0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
140e0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
140f0 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
14100 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
14110 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
14120 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
14130 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
14140 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
14150 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
14160 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
14170 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
14180 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
14190 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
141a0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
141b0 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
141c0 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
141d0 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
141e0 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
141f0 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
14200 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
14210 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
14220 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
14230 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
14240 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
14250 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14260 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
14270 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14280 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14290 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
142a0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
142b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
142c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
142d0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
142e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
142f0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
14300 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
14310 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
14320 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
14330 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14340 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14350 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14370 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
14380 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
14390 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
143a0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
143b0 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
143c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
143d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
143e0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
143f0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
14400 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14410 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
14420 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14430 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14440 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14450 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
14460 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
14480 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14490 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
144a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
144b0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
144c0 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
144d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
144e0 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
144f0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14510 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14520 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
14530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14540 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
14550 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
14560 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14570 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14580 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14590 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
145a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
145b0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
145c0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
145d0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
145e0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
145f0 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
14600 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
14610 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
14620 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14630 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
14640 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14660 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14670 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
14680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
146a0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
146b0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
146c0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
146d0 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
146e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
146f0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14700 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
14710 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
14720 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
14730 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
14740 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
14750 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14760 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
14770 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
14780 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
14790 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
147a0 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
147b0 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
147c0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
147d0 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
147e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
147f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14800 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14810 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
14820 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
14830 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
14840 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14850 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
14860 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
14870 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
14880 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14890 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
148a0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
148b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
148c0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
148d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
148e0 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
148f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14900 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
14910 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
14920 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
14930 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
14940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14950 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
14960 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
14970 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14980 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14990 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
149a0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
149b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
149c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
149d0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
149e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149f0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
14a00 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
14a10 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64  Cont, r1, 0); Vd
14a20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14a30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
14a40 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14a50 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
14a60 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
14a70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
14a80 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20  st, tab1,.      
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
14ab0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
14ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
14ad0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
14ae0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
14af0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14b00 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
14b10 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14b20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14b30 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14b40 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
14b50 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
14b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b70 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
14b80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14b90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14ba0 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
14bb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14bc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
14bd0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
14be0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
14bf0 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
14c00 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
14c10 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
14c20 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
14c30 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
14c40 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
14c50 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
14c60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
14c70 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
14c80 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
14c90 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
14ca0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
14cb0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
14cc0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
14cd0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
14ce0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14cf0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
14d00 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
14d10 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
14d20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
14d30 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
14d40 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
14d50 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
14d60 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
14d70 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
14d80 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
14d90 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
14da0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
14db0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
14dc0 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
14dd0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14e00 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
14e10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
14e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14e30 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
14e40 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
14e50 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
14e60 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
14e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
14e80 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
14e90 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
14ea0 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
14eb0 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
14ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
14ed0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
14ee0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
14ef0 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
14f00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14f10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14f20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
14f30 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
14f40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
14f50 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
14f60 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
14f70 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
14f80 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
14f90 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
14fa0 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
14fb0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
14fc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14fd0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
14fe0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
14ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15000 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
15010 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
15020 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
15030 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
15040 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
15050 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15060 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
15070 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
15080 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
15090 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
150a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
150b0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
150c0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
150d0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
150e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
150f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15100 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
15110 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
15130 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
15140 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15150 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15160 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15170 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
15180 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
15190 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
151a0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
151b0 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
151c0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
151d0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
151e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
151f0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
15200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15220 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
15230 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
15240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15250 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
15260 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15270 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15280 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
152b0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
152c0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
152d0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
152e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
152f0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15300 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
15310 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
15320 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
15330 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
15340 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
15350 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
15360 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
15370 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
15380 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15390 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
153a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
153b0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
153c0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
153d0 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
153e0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
153f0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
15400 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
15410 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
15420 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
15430 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
15440 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
15450 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
15460 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
15470 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
15480 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
15490 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
154a0 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
154b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
154c0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
154d0 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
154e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
154f0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
15500 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
15510 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
15520 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
15530 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
15540 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
15550 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
15560 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
15570 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
15580 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
15590 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
155a0 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
155b0 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
155c0 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
155d0 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
155e0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
155f0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
15600 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
15610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
15620 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
15630 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
15640 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
15650 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
15660 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15670 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
15680 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
15690 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
156a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
156b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
156c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
156d0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
156e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
156f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
15700 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
15710 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
15720 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
15730 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
15740 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
15750 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
15760 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
15770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15780 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
15790 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
157a0 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
157b0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
157c0 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
157d0 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
157e0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
157f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
15800 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
15810 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
15820 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
15830 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
15840 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
15850 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
15860 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
15870 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
15880 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
15890 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
158a0 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
158b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
158c0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
158d0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
158e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
158f0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
15900 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
15910 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
15920 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
15930 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
15940 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
15950 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
15960 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15970 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
15980 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
15990 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  e(v);.    j2 = s
159a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
159b0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
159c0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
159d0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
159e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
15a10 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
15a20 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
15a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
15a50 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
15a60 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65  nue, j2+2); Vdbe
15a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15a80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15a90 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
15aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ab0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
15ac0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
15ad0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
15ae0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
15af0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b00 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
15b10 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
15b20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15b30 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
15b40 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
15b50 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
15b60 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
15b70 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
15b80 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
15b90 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
15ba0 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
15bb0 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
15bc0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
15bd0 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
15be0 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
15bf0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
15c00 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
15c10 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
15c20 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
15c30 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
15c40 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
15c50 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15c60 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
15c70 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
15c80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15ca0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
15cb0 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
15cc0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
15cd0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
15ce0 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
15cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15d00 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15d10 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
15d20 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
15d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15d40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
15d50 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
15d60 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
15d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d80 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
15d90 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15da0 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
15db0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15dc0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
15dd0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
15de0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15df0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
15e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15e10 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15e20 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
15e30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
15e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15e50 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
15e60 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
15e70 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
15e80 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
15e90 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
15ea0 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
15eb0 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
15ec0 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
15ed0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
15ee0 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
15ef0 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
15f00 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
15f10 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
15f20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
15f30 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
15f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15f50 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
15f60 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
15f70 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
15f80 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
15f90 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
15fa0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
15fb0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
15fc0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15fd0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15fe0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
15ff0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16000 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
16010 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
16020 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
16030 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
16040 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
16050 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
16060 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16070 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16090 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
160a0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
160b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
160c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
160d0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
160e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
160f0 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
16100 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
16110 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
16120 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
16130 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
16140 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
16150 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
16160 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
16170 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
16180 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16190 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161a0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
161b0 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
161c0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
161d0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
161e0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
161f0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
16200 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16210 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
16220 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
16230 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
16240 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
16250 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
16260 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
16270 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
16280 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
16290 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
162a0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
162b0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
162c0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
162d0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
162e0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
162f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16300 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
16310 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
16320 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16330 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
16340 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
16350 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
16360 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
16370 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
16380 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16390 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
163a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
163b0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
163c0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
163d0 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
163e0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
163f0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
16400 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
16410 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
16420 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
16430 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
16440 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
16450 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
16460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
16470 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
16480 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
16490 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
164a0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
164b0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
164c0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
164d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
164e0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
164f0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16500 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
16510 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
16520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16530 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
16540 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16550 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16560 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
16570 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
16580 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
16590 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
165a0 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
165b0 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
165c0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
165d0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
165e0 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
165f0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
16600 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
16610 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
16620 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
16630 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
16640 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
16650 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
16660 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
16670 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
16680 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
16690 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
166a0 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
166b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
166c0 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
166d0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
166e0 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
166f0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
16700 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
16710 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
16720 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
16730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16740 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
16750 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16760 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16770 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16780 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16790 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
167a0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
167b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
167c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
167d0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
167e0 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
167f0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
16800 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16810 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
16820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16830 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
16840 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
16850 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
16860 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
16870 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
16880 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
16890 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
168a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
168b0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
168c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
168d0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
168e0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
168f0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
16900 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
16910 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
16920 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
16930 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
16940 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
16950 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
16960 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
16970 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
16980 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
16990 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
169a0 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
169b0 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
169c0 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
169d0 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
169e0 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
169f0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
16a00 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
16a10 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
16a20 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
16a30 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
16a40 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
16a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16a60 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
16a70 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
16a80 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
16a90 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
16aa0 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
16ab0 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
16ac0 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
16ad0 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
16ae0 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
16af0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
16b00 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
16b10 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
16b20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
16b30 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
16b40 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
16b50 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
16b60 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
16b70 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
16b80 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
16b90 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
16ba0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
16bb0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
16bc0 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
16bd0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
16bf0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
16c00 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
16c10 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
16c20 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
16c30 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
16c40 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
16c50 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
16c60 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
16c70 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
16c80 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
16c90 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
16ca0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
16cb0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
16cc0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
16cd0 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
16ce0 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
16cf0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16d00 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
16d10 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
16d20 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
16d30 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16d40 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
16d50 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
16d60 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
16d70 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
16d80 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
16d90 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
16da0 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
16db0 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
16dc0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
16dd0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
16de0 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
16df0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
16e00 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
16e10 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
16e20 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
16e30 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
16e40 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
16e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
16e60 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
16e70 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
16e80 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
16e90 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
16ea0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
16eb0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
16ec0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
16ed0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
16ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
16ef0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
16f00 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
16f10 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
16f20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
16f30 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
16f40 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
16f50 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
16f60 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
16f70 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
16f80 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
16f90 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
16fa0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
16fb0 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
16fc0 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
16fd0 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
16fe0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
16ff0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
17000 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
17010 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
17020 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
17030 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17040 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17050 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17060 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
17070 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
17080 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
17090 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
170a0 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
170b0 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
170c0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
170d0 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
170e0 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
170f0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
17100 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
17110 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
17120 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
17130 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
17140 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
17150 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
17160 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
17170 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
17180 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
17190 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
171a0 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
171b0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
171c0 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
171d0 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
171e0 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
171f0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
17200 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
17210 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
17220 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
17230 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
17240 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
17250 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
17260 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
17270 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
17280 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
17290 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
172a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
172b0 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
172c0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
172d0 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
172e0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
172f0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17300 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
17310 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
17320 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
17330 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
17340 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
17350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17360 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
17370 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
17380 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
17390 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
173a0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
173b0 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
173c0 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
173d0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
173e0 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
173f0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
17400 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
17410 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
17420 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
17430 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
17440 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
17450 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
17460 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
17470 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
17480 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
17490 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
174a0 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
174b0 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
174c0 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
174d0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
174e0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
174f0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
17500 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
17510 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
17520 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
17530 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
17540 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
17550 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
17560 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
17570 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
17580 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
17590 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
175a0 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
175b0 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
175c0 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
175d0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
175e0 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
175f0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17600 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
17610 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
17620 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
17630 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
17640 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
17650 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
17660 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
17670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17680 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
17690 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
176a0 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
176b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
176c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
176d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
176e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
176f0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
17700 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
17710 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
17720 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
17730 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
17740 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
17750 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
17760 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
17770 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17780 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
17790 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
177a0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
177b0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
177c0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
177d0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
177e0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
177f0 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
17800 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
17810 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
17820 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
17830 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
17840 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17850 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
17860 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17870 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
17880 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
17890 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
178a0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
178b0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
178c0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
178d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
178e0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
178f0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
17900 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17910 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
17920 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17930 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
17940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17950 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
17960 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17970 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
17980 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
17990 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
179a0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
179b0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
179c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
179d0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
179e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
179f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
17a00 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
17a10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
17a20 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
17a30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17a40 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
17a50 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17a60 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
17a70 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
17a80 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
17a90 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17aa0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
17ab0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17ac0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
17ad0 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
17ae0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17af0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
17b00 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
17b10 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
17b20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
17b30 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
17b40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17b50 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17b60 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
17b70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17b80 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
17b90 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17ba0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
17bb0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17bc0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
17bd0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17be0 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
17bf0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
17c00 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
17c10 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17c20 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
17c30 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
17c40 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
17c50 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
17c60 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
17c70 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
17c80 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
17c90 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
17ca0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
17cb0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
17cc0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
17cd0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
17ce0 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
17cf0 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
17d00 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
17d10 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
17d20 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
17d30 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
17d40 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
17d50 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
17d60 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
17d70 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
17d80 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
17d90 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
17da0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
17db0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
17dc0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
17dd0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
17de0 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
17df0 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
17e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
17e10 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
17e20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
17e30 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
17e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e50 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
17e60 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
17e70 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
17e80 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
17e90 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
17ea0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
17eb0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
17ec0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
17ed0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
17ee0 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
17ef0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
17f00 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
17f10 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
17f20 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
17f30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
17f40 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
17f50 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
17f60 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
17f70 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
17f80 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
17f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17fa0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
17fb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
17fc0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
17fd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
17fe0 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
17ff0 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
18000 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
18010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18020 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
18030 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
18040 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
18050 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
18060 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
18070 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18080 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
18090 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
180a0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
180b0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
180c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
180d0 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
180e0 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
180f0 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
18100 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
18110 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
18120 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18130 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
18140 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
18150 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
18160 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
18170 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
18180 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
18190 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
181a0 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
181b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
181c0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
181d0 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
181e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
181f0 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
18200 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
18210 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
18220 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
18230 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
18240 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
18250 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
18260 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
18270 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
18280 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
18290 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
182a0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
182b0 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
182c0 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
182d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
182e0 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
182f0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
18300 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
18310 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
18320 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18330 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
18340 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
18350 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
18360 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
18370 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
18380 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
18390 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
183a0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
183b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
183c0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
183d0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
183e0 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
183f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
18400 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
18410 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
18420 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18430 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18440 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
18450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18460 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
18470 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
18480 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
18490 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
184a0 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
184b0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
184d0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
184e0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
184f0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
18500 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
18510 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
18520 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
18530 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
18540 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
18550 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
18560 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
18570 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
18580 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
18590 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
185a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
185b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
185c0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
185d0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
185e0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
185f0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
18600 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
18610 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
18620 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
18630 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
18640 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
18650 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
18660 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
18670 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
18680 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
18690 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
186a0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
186b0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
186c0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
186d0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
186e0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
186f0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
18700 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
18710 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
18720 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18730 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
18740 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
18750 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
18760 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18770 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18780 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
18790 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
187a0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
187b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
187c0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
187d0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
187e0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49  .          && pI
187f0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18800 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
18810 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
18820 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
18830 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18840 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
18850 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
18860 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
18870 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
18880 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
18890 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
188a0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
188b0 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
188c0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
188d0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
188e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
188f0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
18900 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
18910 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
18920 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
18930 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
18940 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
18950 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
18960 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18970 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
18980 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
18990 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
189a0 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
189b0 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
189c0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
189d0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
189e0 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
189f0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
18a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
18a10 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
18a20 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
18a30 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
18a40 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
18a50 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
18a60 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
18a70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
18a80 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
18a90 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
18aa0 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
18ab0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
18ac0 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
18ad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18ae0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
18af0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
18b00 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
18b10 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
18b20 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
18b30 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
18b40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
18b50 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
18b60 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
18b70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18b80 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18b90 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
18ba0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
18bb0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
18bc0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
18bd0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
18be0 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
18bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18c00 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
18c10 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
18c20 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
18c30 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
18c40 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
18c50 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
18c60 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
18c70 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
18c80 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
18c90 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
18ca0 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
18cb0 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
18cc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
18cd0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
18ce0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
18cf0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
18d00 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
18d10 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
18d20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
18d30 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
18d40 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
18d50 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
18d60 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
18d70 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
18d80 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
18d90 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
18da0 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
18db0 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
18dc0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
18dd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18de0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
18df0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
18e00 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
18e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18e50 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
18e60 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
18e70 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
18e80 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
18e90 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
18ea0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
18eb0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
18ec0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
18ed0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
18ee0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18ef0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
18f00 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
18f10 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
18f20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
18f30 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
18f40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
18f50 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
18f60 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
18f70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18f80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18f90 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
18fa0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
18fb0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
18fc0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
18fd0 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
18fe0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
18ff0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
19000 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
19010 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
19020 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19030 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
19040 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
19050 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
19060 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
19070 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
19080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19090 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
190a0 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
190b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
190c0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
190d0 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
190e0 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
190f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
19100 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
19110 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
19120 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
19130 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
19140 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
19150 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
19160 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19170 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
19180 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
19190 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
191a0 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
191b0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
191c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
191d0 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  v, j1);..  /* Ge
191e0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
191f0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
19200 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19210 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
19220 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
19230 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
19240 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
19250 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19260 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
19270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19280 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
19290 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
192a0 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
192b0 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
192c0 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
192d0 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
192e0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
192f0 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
19300 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
19310 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
19320 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
19330 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
19340 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
19350 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
19360 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
19370 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19380 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
19390 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
193a0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
193b0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
193c0 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
193d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
193e0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
193f0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
19400 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19410 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
19420 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
19430 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
19440 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
19450 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
19460 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19470 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19480 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19490 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
194a0 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
194b0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
194c0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
194d0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
194f0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
19500 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
19510 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
19520 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
19530 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
19540 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19550 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19560 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19570 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
19580 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19590 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
195a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
195b0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
195c0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
195d0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
195e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
195f0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
19600 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
19610 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
19620 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
19630 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
19660 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19680 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
19690 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
196a0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
196b0 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
196c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
196d0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
196e0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
196f0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
19700 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
19710 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
19720 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
19730 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
19740 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
19750 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
19760 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
19770 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
19780 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
19790 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
197a0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
197b0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
197c0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
197d0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
197e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
197f0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
19800 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
19810 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
19820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19830 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19840 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
19880 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19890 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
198a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
198b0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
198c0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
198d0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
198e0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
198f0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19900 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
19910 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
19920 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
19930 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
19940 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
19950 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
19960 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
19970 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
19980 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
19990 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
199a0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
199b0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
199c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
199d0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
199e0 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
199f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
19a00 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
19a10 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19a20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
19a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19a40 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
19a50 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
19a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19a70 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19a80 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
19a90 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
19aa0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19ab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ac0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19ad0 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
19ae0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19af0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
19b00 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
19b10 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19b20 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
19b30 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
19b40 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
19b50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19b60 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
19b70 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
19b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b90 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19ba0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
19bb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19be0 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
19bf0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19c00 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
19c10 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
19c20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19c30 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
19c40 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
19c50 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
19c60 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
19c70 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
19c80 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
19c90 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
19ca0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
19cb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
19cc0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
19cd0 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
19ce0 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
19cf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19d00 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19d10 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
19d20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d40 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
19d50 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
19d60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19d70 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
19d80 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
19d90 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19da0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
19db0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
19dc0 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
19dd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19de0 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
19df0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
19e00 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
19e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e20 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19e30 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
19e40 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
19e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
19e70 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
19e80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19e90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ea0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19eb0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
19ec0 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
19ed0 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
19ee0 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
19ef0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
19f00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
19f10 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
19f20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19f30 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19f40 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
19f50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f70 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
19f80 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
19f90 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
19fa0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
19fb0 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
19fc0 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
19fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19fe0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
19ff0 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1a000 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a010 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1a020 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1a030 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1a040 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1a050 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a060 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1a070 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1a080 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1a0b0 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1a0c0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1a0d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1a0e0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1a0f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a100 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1a110 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1a120 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1a130 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a140 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a150 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1a160 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1a170 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1a180 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a190 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a1a0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1a1b0 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
1a1c0 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
1a1d0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1a1e0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1a1f0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
1a200 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
1a210 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
1a220 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
1a230 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
1a240 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
1a250 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1a260 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
1a270 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1a280 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1a290 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1a2a0 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1a2b0 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1a2c0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1a2d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1a2e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1a2f0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1a300 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a310 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1a320 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1a330 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1a340 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a350 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1a360 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1a370 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1a380 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1a390 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1a3a0 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1a3b0 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1a3c0 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1a3d0 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1a3e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
1a3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1a400 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1a410 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1a420 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1a430 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1a440 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
1a450 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1a460 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1a470 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
1a480 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
1a490 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
1a4a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1a4b0 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
1a4c0 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
1a4d0 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
1a4e0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1a4f0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1a500 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1a510 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1a520 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1a530 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1a540 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1a550 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1a560 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1a570 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1a580 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1a590 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1a5a0 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1a5b0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1a5c0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1a5d0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1a5e0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1a5f0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1a600 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1a610 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1a620 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1a630 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1a640 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1a650 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1a660 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1a670 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1a680 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1a690 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1a6a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1a6b0 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
1a6c0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1a6d0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1a6e0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1a6f0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1a700 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1a710 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1a720 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1a730 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1a740 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1a750 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
1a760 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1a770 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1a780 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
1a790 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1a7a0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a7b0 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1a7c0 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1a7d0 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
1a7e0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1a7f0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1a800 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1a810 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1a820 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
1a830 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
1a840 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1a850 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a860 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1a870 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1a880 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
1a890 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1a8a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1a8b0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1a8c0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1a8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1a8e0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1a8f0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
1a900 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1a910 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
1a920 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1a930 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1a940 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1a950 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1a960 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1a970 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
1a980 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1a990 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
1a9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a9b0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1a9c0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
1a9d0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1a9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
1a9f0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1aa00 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
1aa10 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
1aa20 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
1aa30 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1aa40 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1aa50 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
1aa60 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1aa70 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1aa80 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1aa90 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1aaa0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1aab0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1aac0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1aad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aae0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1aaf0 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
1ab00 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1ab10 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ab20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ab30 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ab40 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
1ab50 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1ab60 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1ab70 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1ab80 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ab90 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
1aba0 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1abb0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1abc0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
1abd0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1abe0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1abf0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1ac00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ac10 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1ac20 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1ac30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1ac40 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1ac50 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1ac60 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1ac70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1ac80 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1ac90 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1aca0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1acb0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1acc0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1acd0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1ace0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1ad00 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1ad10 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
1ad20 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1ad30 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1ad40 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1ad50 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1ad60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
1ad70 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1ad80 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
1ad90 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
1ada0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
1adb0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1adc0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
1add0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1ade0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1adf0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1ae00 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1ae10 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
1ae20 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
1ae30 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
1ae40 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
1ae50 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
1ae60 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
1ae70 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1ae80 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
1ae90 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
1aea0 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
1aeb0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1aec0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
1aed0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1aee0 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
1aef0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1af00 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
1af10 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
1af20 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
1af30 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
1af40 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
1af50 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
1af60 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
1af70 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
1af80 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
1af90 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
1afa0 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
1afb0 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
1afc0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1afd0 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1afe0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1aff0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1b000 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b010 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1b020 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b030 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1b040 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1b050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b060 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1b070 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1b080 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1b090 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b0a0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b0b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b0c0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1b0d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1b0e0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1b0f0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1b100 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1b110 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1b120 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1b130 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1b140 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1b150 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1b160 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1b170 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1b180 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1b190 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1b1a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1b1b0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1b1c0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1b1d0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1b1e0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1b1f0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1b200 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1b210 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1b220 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1b230 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1b240 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1b250 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1b260 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1b270 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1b280 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1b290 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1b2a0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1b2b0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1b2c0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1b2d0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1b2e0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1b2f0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1b300 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1b310 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1b320 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1b330 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1b340 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1b350 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1b360 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1b370 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1b380 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1b390 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1b3a0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1b3b0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1b3c0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1b3d0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1b3e0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1b3f0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1b400 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1b410 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1b420 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1b430 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1b440 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1b450 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1b460 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1b470 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1b480 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1b490 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1b4a0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1b4b0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1b4c0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1b4d0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1b4e0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1b4f0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1b500 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1b510 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1b520 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1b530 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1b540 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1b550 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1b560 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1b570 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1b580 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1b590 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1b5a0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1b5b0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1b5c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1b5d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1b5e0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1b5f0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1b600 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1b610 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1b620 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1b630 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1b640 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1b650 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1b660 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1b670 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1b680 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1b690 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1b6a0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1b6b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1b6c0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1b6d0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1b6e0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1b6f0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1b700 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1b710 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1b720 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1b730 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1b740 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1b750 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1b760 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b770 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1b780 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b790 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1b7a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1b7b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1b7c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1b7d0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1b7e0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1b7f0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1b800 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1b810 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1b820 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1b830 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1b840 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1b850 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1b860 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1b870 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1b880 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1b890 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1b8a0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1b8b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b8c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1b8d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b8e0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1b8f0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1b900 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b910 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1b920 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1b930 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1b940 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1b950 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1b960 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1b970 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1b980 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1b990 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1b9a0 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1b9b0 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1b9c0 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1b9d0 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1b9e0 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1b9f0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1ba00 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1ba10 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1ba20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ba30 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
1ba40 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a      use LIMIT.".
1ba50 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1ba60 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1ba70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1ba80 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1ba90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1baa0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1bab0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1bac0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1bad0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1bae0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1baf0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1bb00 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1bb10 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1bb20 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1bb30 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1bb40 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1bb50 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1bb60 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1bb70 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1bb80 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1bb90 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1bba0 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1bbb0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1bbc0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1bbd0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1bbe0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1bbf0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1bc00 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1bc10 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1bc20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1bc30 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1bc40 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1bc50 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1bc60 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1bc70 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1bc80 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1bc90 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1bca0 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1bcb0 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1bcc0 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1bcd0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1bce0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1bcf0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1bd00 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1bd10 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1bd20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1bd30 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1bd40 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1bd50 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1bd60 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1bd70 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1bd80 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1bd90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1bda0 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1bdb0 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1bdc0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1bdd0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1bde0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1bdf0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1be00 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1be10 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1be20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1be30 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1be40 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1be50 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1be60 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1be70 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1be80 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1be90 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1bea0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1beb0 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1bec0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1bed0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1bee0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1bef0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1bf00 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1bf10 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1bf20 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1bf30 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1bf40 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1bf50 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1bf60 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1bf70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1bf80 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1bf90 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1bfa0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1bfb0 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1bfc0 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1bfd0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1bfe0 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1bff0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1c000 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1c010 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1c020 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1c030 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1c040 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1c050 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1c060 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1c070 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1c080 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1c090 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1c0a0 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1c0b0 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1c0c0 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1c0d0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1c0e0 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1c0f0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1c100 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1c110 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1c120 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1c130 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1c140 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1c150 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1c160 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c170 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1c180 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1c190 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1c1a0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1c1b0 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1c1c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1c1d0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1c1e0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1c1f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1c200 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c210 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c220 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c230 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1c240 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1c250 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1c260 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1c270 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1c280 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1c290 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1c2a0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1c2b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1c2c0 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1c2d0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1c2e0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1c2f0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1c300 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1c310 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1c320 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c330 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1c340 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1c350 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1c360 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1c370 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1c380 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1c390 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1c3a0 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1c3b0 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1c3c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1c3d0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c3e0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c3f0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1c400 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1c410 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1c420 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1c430 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1c440 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1c450 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1c460 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1c470 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1c480 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1c490 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1c4a0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c4b0 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1c4c0 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1c4d0 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1c4e0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1c4f0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1c500 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1c510 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1c520 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1c530 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1c540 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1c550 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1c560 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1c570 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68  .**.**  (24)  Th
1c580 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c590 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  t an aggregate t
1c5a0 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1c5b0 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1c5c0 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1c5d0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1c5e0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1c5f0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1c600 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1c610 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1c620 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1c630 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1c640 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1c650 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1c660 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1c670 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1c680 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1c690 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1c6a0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1c6b0 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1c6c0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1c6d0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1c6e0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1c6f0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1c700 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1c710 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1c720 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1c730 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1c740 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1c750 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1c760 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1c770 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1c780 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1c790 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1c7a0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1c7b0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1c7c0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1c7d0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1c7e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1c7f0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1c800 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1c810 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1c820 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1c830 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1c840 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1c850 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1c860 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1c870 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1c880 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1c890 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1c8a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c8b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c8d0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1c8e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c8f0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1c900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c910 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1c920 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1c930 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1c940 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1c950 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1c960 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1c970 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c980 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1c990 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1c9a0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1c9b0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1c9c0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1c9d0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1c9e0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1c9f0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1ca00 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1ca10 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1ca20 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1ca30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ca40 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1ca50 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1ca60 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1ca70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1ca80 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1ca90 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1caa0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1cab0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1cac0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1cad0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cae0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1caf0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1cb00 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1cb10 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1cb20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1cb30 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1cb40 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1cb50 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1cb60 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1cb70 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1cb80 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1cb90 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1cba0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1cbb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1cbc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1cbd0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1cbe0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1cbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cc00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1cc10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cc20 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1cc30 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1cc40 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1cc50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1cc60 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1cc70 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1cc80 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1cc90 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1cca0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1ccb0 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1ccc0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1ccd0 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1cce0 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1ccf0 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1cd00 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1cd10 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1cd20 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1cd30 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1cd40 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1cd50 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1cd60 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1cd70 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1cd80 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1cd90 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1cda0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1cdb0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1cdc0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1cdd0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1cde0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1cdf0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
1ce00 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
1ce10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce30 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1ce40 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
1ce50 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
1ce60 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1ce70 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
1ce80 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
1ce90 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
1cea0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1ceb0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1cec0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1ced0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1cee0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1cef0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1cf00 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1cf10 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1cf20 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1cf30 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1cf40 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1cf50 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1cf60 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1cf70 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1cf80 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1cf90 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1cfa0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1cfb0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1cfc0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1cfd0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1cfe0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1cff0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1d000 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1d010 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1d020 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1d030 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d040 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d050 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1d060 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1d070 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d0a0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1d0b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1d0c0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1d0d0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1d0e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d120 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1d130 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1d140 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1d150 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d170 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1d180 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1d190 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d1a0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1d1b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1d1c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1d1d0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1d1e0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1d1f0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1d200 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1d210 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1d220 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1d230 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1d240 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1d250 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1d260 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1d270 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1d280 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1d290 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1d2a0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1d2b0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1d2c0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d2d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d310 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1d320 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1d330 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1d340 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d360 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1d370 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d380 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1d390 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1d3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d3b0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1d3c0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d3d0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1d3e0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d3f0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1d400 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d410 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d420 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  (21) */.  }.  te
1d430 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1d440 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1d450 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63  rsive );.  testc
1d460 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1d470 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41  ags & SF_MinMaxA
1d480 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  gg );.  if( pSub
1d490 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1d4a0 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69  _Recursive|SF_Mi
1d4b0 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20  nMaxAgg) ){.    
1d4c0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1d4d0 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61  trictions (22) a
1d4e0 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20  nd (24) */.  }. 
1d4f0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1d500 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1d510 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1d520 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1d530 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1d540 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (23) */.  }.. 
1d550 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1d560 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1d570 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1d580 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1d590 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1d5a0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1d5b0 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1d5c0 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1d5d0 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1d5e0 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1d5f0 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1d600 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1d610 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1d620 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1d630 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1d640 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1d650 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1d660 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1d670 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1d680 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1d690 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1d6a0 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1d6b0 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1d6c0 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1d6d0 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1d6e0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1d6f0 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1d700 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1d710 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d720 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1d730 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1d740 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1d750 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1d760 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1d770 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1d780 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1d790 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1d7a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1d7b0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1d7c0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1d7d0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1d7e0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1d7f0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1d800 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1d810 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1d820 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1d830 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1d840 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1d850 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1d860 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1d870 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1d880 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1d890 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1d8a0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1d8b0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1d8c0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1d8d0 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1d8e0 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1d8f0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1d900 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1d910 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1d920 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1d930 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1d940 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1d950 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1d960 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1d970 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1d980 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1d990 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1d9a0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1d9b0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1d9c0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1d9d0 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1d9e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1d9f0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1da00 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1da10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1da20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1da30 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1da40 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1da50 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1da60 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1da70 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1da80 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1da90 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1daa0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1dab0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1dac0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1dad0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1dae0 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1daf0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1db00 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1db10 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1db20 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1db30 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1db40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1db50 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1db60 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1db70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1db80 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1db90 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1dba0 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1dbb0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1dbc0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1dbd0 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1dbe0 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1dbf0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1dc00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc10 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1dc20 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1dc30 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1dc40 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1dc60 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1dc70 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1dc80 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1dc90 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1dca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1dcb0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1dcc0 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1dcd0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1dce0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1dcf0 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1dd00 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1dd10 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1dd20 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1dd30 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1dd40 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c  >nSrc<1.       |
1dd50 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  | pSub->pEList->
1dd60 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45  nExpr!=pSub1->pE
1dd70 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
1dd80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1dd90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1dda0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ddb0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1ddc0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1ddd0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dde0 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1ddf0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1de00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1de10 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1de20 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1de30 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1de40 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1de50 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1de60 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1de70 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1de80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1de90 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1dea0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1deb0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1dec0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
1ded0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
1dee0 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
1def0 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  s.%p from term %
1df00 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1df10 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a           pSub->z
1df20 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69  SelName, pSub, i
1df30 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
1df40 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
1df50 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
1df60 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1df70 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1df80 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
1df90 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
1dfa0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1dfb0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1dfc0 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
1dfd0 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
1dfe0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
1dff0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
1e000 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
1e010 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
1e020 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1e030 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1e040 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
1e050 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
1e060 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
1e070 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
1e080 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
1e090 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
1e0a0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
1e0b0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
1e0c0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
1e0d0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
1e0e0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
1e0f0 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
1e100 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
1e110 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
1e120 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
1e130 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
1e140 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
1e150 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
1e160 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
1e170 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
1e180 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1e190 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
1e1a0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
1e1b0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
1e1c0 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
1e1d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
1e1e0 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
1e1f0 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
1e200 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
1e210 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
1e220 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
1e230 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1e240 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
1e250 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
1e260 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
1e270 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
1e280 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
1e290 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
1e2a0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1e2b0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1e2c0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1e2d0 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
1e2e0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1e2f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1e300 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
1e310 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
1e320 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
1e330 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1e340 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
1e350 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
1e360 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
1e370 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
1e380 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1e390 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1e3a0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
1e3b0 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
1e3c0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1e3d0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1e3e0 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
1e3f0 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
1e400 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
1e410 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
1e420 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
1e430 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
1e440 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1e450 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
1e460 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
1e470 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
1e480 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1e490 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1e4a0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
1e4b0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
1e4c0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
1e4d0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
1e4e0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70  >pLimit;.    Exp
1e4f0 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r *pOffset = p->
1e500 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c  pOffset;.    Sel
1e510 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
1e520 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
1e530 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1e540 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
1e550 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
1e560 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1e570 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66  = 0;.    p->pOff
1e580 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
1e590 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
1e5a0 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
1e5b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1e5c0 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
1e5d0 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a  Sub->zSelName);.
1e5e0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1e5f0 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d   pOffset;.    p-
1e600 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1e610 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1e620 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1e630 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
1e640 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
1e650 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
1e660 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1e670 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1e680 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1e690 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
1e6a0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
1e6b0 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
1e6c0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
1e6d0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
1e6e0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
1e6f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
1e700 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
1e710 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
1e720 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
1e730 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1e740 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
1e750 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
1e760 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
1e770 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
1e780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e790 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e7a0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1e7b0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
1e7c0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
1e7d0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
1e7e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
1e7f0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
1e800 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1e810 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1e820 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1e830 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
1e840 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
1e850 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
1e860 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e870 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
1e880 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
1e890 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1e8a0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1e8b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e8c0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
1e8d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1e8e0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1e8f0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
1e900 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1e910 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e920 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
1e930 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
1e940 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1e950 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
1e960 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
1e970 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
1e980 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1e990 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1e9a0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
1e9b0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
1e9c0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
1e9d0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
1e9e0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
1e9f0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
1ea00 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
1ea10 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
1ea20 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
1ea30 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
1ea40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
1ea50 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
1ea60 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
1ea70 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
1ea80 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
1ea90 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
1eaa0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
1eab0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
1eac0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
1ead0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
1eae0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
1eaf0 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
1eb00 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
1eb10 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1eb20 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1eb30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
1eb40 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
1eb50 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
1eb60 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
1eb70 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1eb80 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
1eb90 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
1eba0 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
1ebb0 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
1ebc0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
1ebd0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
1ebe0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1ebf0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1ec00 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
1ec10 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1ec20 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
1ec30 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
1ec40 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
1ec50 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
1ec60 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
1ec70 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
1ec80 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
1ec90 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
1eca0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1ecb0 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
1ecc0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
1ecd0 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
1ece0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
1ecf0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
1ed00 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
1ed10 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
1ed20 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
1ed30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ed40 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ed50 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
1ed60 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
1ed70 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
1ed80 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1ed90 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
1eda0 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
1edb0 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
1edc0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1edd0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1ede0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1edf0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
1ee00 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1ee10 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
1ee20 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
1ee30 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
1ee40 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
1ee50 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
1ee60 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
1ee70 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
1ee80 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
1ee90 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
1eea0 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
1eeb0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
1eec0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
1eed0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
1eee0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
1eef0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1ef00 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
1ef10 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
1ef20 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
1ef30 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
1ef40 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1ef50 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
1ef60 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
1ef70 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
1ef80 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1ef90 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
1efa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
1efb0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1efc0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1efd0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1efe0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
1eff0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
1f000 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1f010 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
1f020 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
1f030 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1f040 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
1f050 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1f060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f070 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1f080 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
1f090 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
1f0a0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
1f0b0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1f0c0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1f0d0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1f0e0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1f0f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1f100 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
1f110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1f120 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f130 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1f140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f150 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
1f160 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
1f170 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
1f180 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1f190 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
1f1a0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
1f1b0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
1f1c0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
1f1d0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1f1e0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
1f1f0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
1f200 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
1f210 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
1f220 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
1f230 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
1f240 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
1f250 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1f260 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f270 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f280 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
1f290 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
1f2a0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
1f2b0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
1f2c0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
1f2d0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
1f2e0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
1f2f0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
1f300 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
1f310 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
1f320 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
1f330 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
1f340 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
1f350 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
1f360 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
1f370 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
1f380 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
1f390 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
1f3a0 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
1f3b0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
1f3c0 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
1f3d0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1f3e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f3f0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1f400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f410 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
1f420 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1f430 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
1f440 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1f450 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
1f460 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
1f470 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1f480 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1f490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f4a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f4b0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
1f4c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
1f4d0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
1f4e0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
1f4f0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
1f500 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1f510 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
1f520 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1f530 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1f540 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
1f550 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
1f560 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
1f570 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
1f580 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
1f590 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
1f5a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
1f5b0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
1f5c0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
1f5d0 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
1f5e0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
1f5f0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
1f600 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
1f610 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
1f620 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
1f630 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
1f640 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
1f650 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
1f660 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
1f670 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1f680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1f690 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
1f6a0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
1f6b0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
1f6c0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
1f6d0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1f700 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
1f710 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
1f720 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
1f730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f740 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
1f750 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f760 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
1f770 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
1f780 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
1f790 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
1f7a0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
1f7b0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1f7c0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
1f7d0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
1f7e0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
1f7f0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
1f800 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
1f810 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
1f820 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
1f830 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
1f840 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1f850 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1f860 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1f870 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1f880 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1f890 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1f8a0 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
1f8b0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
1f8c0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
1f8d0 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
1f8e0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1f8f0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
1f900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1f910 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1f920 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1f930 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1f940 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1f950 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1f960 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1f970 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1f980 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1f990 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1f9a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1f9b0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1f9c0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1f9d0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1f9e0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1f9f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1fa00 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1fa10 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
1fa20 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65  oint, any non-ze
1fa30 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76  ro iOrderByCol v
1fa40 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74  alues indicate t
1fa50 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
1fa60 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
1fa70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
1fa80 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20  dentical to the 
1fa90 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20  iOrderByCol'th. 
1faa0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
1fab0 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  on returned by S
1fac0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1fad0 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73  pSub. Since thes
1fae0 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  e values.      *
1faf0 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61  * do not necessa
1fb00 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20  rily correspond 
1fb10 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45  to columns in SE
1fb20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
1fb30 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a  Parent,.      **
1fb40 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72   zero them befor
1fb50 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68  e transfering th
1fb60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1fb70 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1fb80 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74    ** Not doing t
1fb90 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e  his may cause an
1fba0 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73   error if a subs
1fbb0 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74  equent call to t
1fbc0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
1fbd0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1fbe0 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70  o flatten a comp
1fbf0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
1fc00 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20  nto pParent.    
1fc10 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77    ** (the only w
1fc20 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1fc30 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d  en is if the com
1fc40 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
1fc50 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  is.      ** curr
1fc60 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53  ently part of pS
1fc70 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74  ub->pSrc). See t
1fc80 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38  icket [d11a6e908
1fc90 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78  f].  */.      Ex
1fca0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1fcb0 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1fcc0 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  y;.      for(i=0
1fcd0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
1fce0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1fcf0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
1fd00 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1fd10 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
1fd20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1fd30 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
1fd40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1fd50 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  t( pSub->pPrior=
1fd60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1fd70 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
1fd80 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
1fd90 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
1fda0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1fdb0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1fdc0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62  rBy ){.      sub
1fdd0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1fde0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1fdf0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1fe00 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1fe10 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
1fe20 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57  here ){.      pW
1fe30 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1fe40 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1fe50 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1fe60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68  }else{.      pWh
1fe70 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ere = 0;.    }. 
1fe80 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
1fe90 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
1fea0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1feb0 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
1fec0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1fed0 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
1fee0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1fef0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
1ff00 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1ff10 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1ff20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1ff30 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1ff40 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1ff50 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1ff60 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1ff70 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1ff80 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1ff90 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20  ving, .         
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ffc0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1ffd0 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a  ->pHaving, 0));.
1ffe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1fff0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d  arent->pGroupBy=
20000 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20010 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  ent->pGroupBy = 
20020 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
20030 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72  up(db, pSub->pGr
20040 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d  oupBy, 0);.    }
20050 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
20060 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75  ent->pWhere = su
20070 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
20080 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
20090 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
200a0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
200b0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
200c0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
200d0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
200e0 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
200f0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
20100 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
20110 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
20120 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
20130 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
20140 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
20150 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
20160 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
20170 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
20180 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
20190 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
201a0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
201b0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
201c0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
201d0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
201e0 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
201f0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
20200 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
20210 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
20220 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
20230 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
20240 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
20250 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
20260 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
20270 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
20280 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
20290 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
202a0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
202b0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
202c0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
202d0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
202e0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
202f0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
20300 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
20310 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
20320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
20330 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
20340 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
20350 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
20360 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20370 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
20380 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20390 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
203a0 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74  /*.** Based on t
203b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
203c0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
203d0 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
203e0 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
203f0 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
20400 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
20410 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
20420 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
20430 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f    * the query co
20440 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69  ntains just a si
20450 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  ngle aggregate f
20460 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a  unction,.**    *
20470 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
20480 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65  unction is eithe
20490 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  r min() or max()
204a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68  , and.**    * th
204b0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
204c0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
204d0 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  tion is a column
204e0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
204f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
20500 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  e are true, then
20510 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
20520 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
20530 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65  RBY_MAX.** is re
20540 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70  turned as approp
20550 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70  riate. Also, *pp
20560 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
20570 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a   point to the .*
20580 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  * list of argume
20590 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
205a0 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f  e aggregate befo
205b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
205c0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63  .** Or, if the c
205d0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
205e0 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70  are not met, *pp
205f0 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
20600 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f   0 and.** WHERE_
20610 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69  ORDERBY_NORMAL i
20620 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
20630 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
20640 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41  uery(AggInfo *pA
20650 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74  ggInfo, ExprList
20660 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
20670 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
20680 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
20690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
206a0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
206b0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20  *ppMinMax = 0;. 
206c0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
206d0 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45  Func==1 ){.    E
206e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67  xpr *pExpr = pAg
206f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
20700 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67  pExpr; /* Aggreg
20710 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
20720 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
20730 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
20740 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41  pList;      /* A
20750 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
20760 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  function */..   
20770 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20780 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
20790 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ION );.    if( p
207a0 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
207b0 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c  >nExpr==1 && pEL
207c0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
207d0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
207e0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  MN ){.      cons
207f0 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20  t char *zFunc = 
20800 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
20810 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
20820 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
20830 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
20840 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
20850 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
20860 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
20870 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
20880 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
20890 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
208a0 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
208b0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
208c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
208d0 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
208e0 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
208f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
20900 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
20910 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69  Max==0 || (*ppMi
20920 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20  nMax)->nExpr==1 
20930 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  );.  return eRet
20940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
20950 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
20960 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
20970 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
20980 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
20990 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
209a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
209b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
209c0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
209d0 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
209e0 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
209f0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
20a00 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
20a10 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
20a20 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
20a30 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
20a40 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
20a50 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
20a60 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
20a70 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
20a80 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
20a90 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
20aa0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
20ab0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
20ac0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
20ad0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
20ae0 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
20af0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
20b00 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
20b10 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
20b20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
20b30 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
20b40 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
20b50 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
20b60 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
20b70 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
20b80 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
20b90 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
20ba0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
20bb0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
20bc0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
20bd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
20be0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
20bf0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
20c00 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
20c10 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
20c20 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
20c30 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
20c40 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
20c50 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
20c60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
20c70 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
20c80 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
20c90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
20ca0 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
20cb0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
20cc0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
20cd0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
20ce0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
20cf0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
20d00 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
20d10 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
20d20 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
20d30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
20d40 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
20d50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
20d60 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
20d70 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
20d80 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
20d90 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
20da0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
20db0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
20dc0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
20dd0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
20de0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
20df0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
20e00 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
20e10 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
20e20 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
20e30 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
20e40 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
20e50 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
20e60 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
20e70 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
20e80 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
20e90 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
20ea0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
20eb0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
20ec0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20ed0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
20ee0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
20ef0 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20  m->zIndex ){.   
20f00 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
20f10 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
20f20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
20f30 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
20f40 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
20f50 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
20f60 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
20f70 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
20f80 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
20f90 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20  zName, zIndex); 
20fa0 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
20fb0 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
20fc0 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
20fd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20fe0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20ff0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
21000 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b  %s", zIndex, 0);
21010 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
21020 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
21030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21040 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
21050 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64  .    pFrom->pInd
21060 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
21070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21080 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
21090 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
210a0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
210b0 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
210c0 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
210d0 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
210e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
210f0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
21100 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
21110 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
21120 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
21130 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
21140 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
21150 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
21160 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
21170 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
21180 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
21190 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
211a0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
211b0 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
211c0 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
211d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
211e0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
211f0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
21200 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
21210 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
21220 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
21230 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
21240 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
21250 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
21260 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21270 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
21280 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
21290 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
212a0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
212b0 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
212c0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
212d0 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
212e0 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
212f0 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
21300 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
21310 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
21320 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
21330 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
21340 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
21350 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
21360 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
21370 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
21380 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
21390 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
213a0 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
213b0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
213c0 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
213d0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
213e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
213f0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
21400 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
21410 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
21420 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
21430 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
21440 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
21450 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
21460 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
21470 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
21480 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
21490 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
214a0 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
214b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
214c0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
214d0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
214e0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
214f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
21500 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
21510 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
21520 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
21530 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
21540 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
21550 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
21560 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
21570 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
21580 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
21590 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
215a0 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
215b0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
215c0 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
215d0 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
215e0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
215f0 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
21600 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
21610 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
21620 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
21630 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
21640 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
21650 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
21660 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
21670 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
21680 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
21690 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
216a0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
216b0 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
216c0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
216d0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
216e0 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
216f0 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
21700 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
21710 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
21720 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
21730 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
21740 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
21750 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
21760 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
21770 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
21780 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
21790 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
217a0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
217b0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
217c0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
217d0 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e  _ALL, 0));.  p->
217e0 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
217f0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
21800 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
21810 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
21820 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e  Having = 0;.  pN
21830 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ew->pOrderBy = 0
21840 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
21850 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  0;.  p->pNext = 
21860 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  0;.  p->selFlags
21870 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
21880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
21890 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
218a0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
218b0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
218c0 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
218d0 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
218e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
218f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
21900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21910 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
21920 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
21930 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
21940 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
21950 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
21960 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
21970 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
21980 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
21990 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
219a0 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
219b0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
219c0 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
219d0 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
219e0 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
219f0 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
21a00 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
21a10 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
21a20 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
21a30 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
21a40 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
21a50 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
21a60 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
21a70 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
21a80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
21a90 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
21aa0 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
21ab0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
21ac0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
21ad0 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
21ae0 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
21af0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
21b00 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
21b10 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48  t outermost WITH
21b20 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
21b30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21b40 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
21b50 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
21b60 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
21b70 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
21b80 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
21b90 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
21ba0 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
21bb0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
21bc0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
21bd0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
21be0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
21bf0 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
21c00 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
21c10 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
21c20 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
21c30 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
21c40 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
21c50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21c60 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
21c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
21c80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
21c90 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
21ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21cb0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
21cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
21cd0 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
21ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21cf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21d00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
21d10 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
21d20 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
21d30 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
21d40 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
21d50 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
21d60 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
21d70 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
21d80 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
21d90 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
21da0 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
21db0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
21dc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21dd0 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
21de0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
21df0 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
21e00 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
21e10 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
21e20 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
21e30 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
21e40 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
21e50 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
21e60 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
21e70 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
21e80 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
21e90 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
21ea0 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
21eb0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
21ec0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
21ed0 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
21ee0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
21ef0 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
21f00 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
21f10 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
21f20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21f30 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
21f40 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
21f50 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50  ( bFree==0 || pP
21f60 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29  arse->pWith==0 )
21f70 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
21f80 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
21f90 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
21fa0 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
21fb0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
21fc0 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65     pParse->bFree
21fd0 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20  With = bFree;.  
21fe0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
21ff0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
22000 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
22010 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
22020 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
22030 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
22040 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
22050 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
22060 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
22070 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
22080 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
22090 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
220a0 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
220b0 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
220c0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
220d0 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
220e0 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
220f0 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
22100 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
22110 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
22120 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
22130 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
22140 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
22150 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
22160 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
22170 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
22180 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
22190 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
221a0 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
221b0 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
221c0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
221d0 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
221e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
221f0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
22200 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
22210 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
22220 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
22230 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
22240 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
22250 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
22260 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
22270 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
22280 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22290 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
222a0 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
222b0 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
222c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
222d0 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
222e0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
222f0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
22300 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22310 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
22320 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
22330 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
22340 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
22350 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
22360 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22380 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
22390 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
223a0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
223b0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
223c0 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
223d0 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
223e0 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
223f0 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
22400 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
22410 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
22420 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
22430 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
22440 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
22470 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
22480 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
22490 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
224a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
224b0 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
224c0 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
224d0 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
224e0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
224f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
22500 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
22510 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
22520 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20  f pCte->zErr is 
22530 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
22540 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
22550 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
22560 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
22570 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
22580 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
22590 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
225a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
225b0 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
225c0 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c  e->zErr is NULL,
225d0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
225e0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
225f0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
22600 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
22610 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
22620 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b  f( pCte->zErr ){
22630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22640 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
22650 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d  Cte->zErr, pCte-
22660 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
22670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22680 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  OR;.    }..    a
22690 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
226a0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
226b0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
226c0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
226d0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
226e0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
226f0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
22700 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22710 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
22720 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
22730 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
22740 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
22750 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
22760 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
22770 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
22780 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
22790 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
227a0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
227b0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
227c0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
227d0 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  l;.    pFrom->pS
227e0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
227f0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
22800 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
22810 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
22820 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
22830 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22840 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
22850 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
22860 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
22870 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
22880 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
22890 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
228a0 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
228b0 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
228c0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
228d0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
228e0 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
228f0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
22900 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
22910 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
22920 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
22930 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
22940 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
22950 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
22960 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
22970 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
22980 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
22990 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
229a0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
229b0 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
229c0 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
229d0 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
229e0 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
229f0 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
22a00 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
22a10 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
22a20 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
22a30 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
22a40 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
22a50 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
22a60 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
22a70 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
22a80 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
22a90 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
22aa0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22ab0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
22ac0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
22ad0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
22ae0 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
22af0 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  nRef>2 ){.      
22b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22b10 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
22b20 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
22b30 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
22b40 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
22b50 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
22b60 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
22b70 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
22b80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22b90 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31  t( pTab->nRef==1
22ba0 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46   || ((pSel->selF
22bb0 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76  lags&SF_Recursiv
22bc0 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66  e) && pTab->nRef
22bd0 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
22be0 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72 63 75  e->zErr = "circu
22bf0 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
22c00 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
22c10 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
22c20 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
22c30 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
22c40 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
22c50 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d  lect(pWalker, bM
22c60 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53  ayRecursive ? pS
22c70 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65  el->pPrior : pSe
22c80 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  l);..    for(pLe
22c90 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
22ca0 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
22cb0 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
22cc0 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
22cd0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
22ce0 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
22cf0 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
22d00 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e  t->nExpr!=pCte->
22d10 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a  pCols->nExpr ){.
22d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22d30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22d40 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64  "table %s has %d
22d50 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
22d60 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20  olumns",.       
22d70 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65       pCte->zName
22d80 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
22d90 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45   pCte->pCols->nE
22da0 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
22db0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
22dc0 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
22dd0 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  h;.        retur
22de0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
22df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
22e00 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f  List = pCte->pCo
22e10 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ls;.    }..    s
22e20 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
22e30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
22e40 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
22e50 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
22e60 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
22e70 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
22e80 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
22e90 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
22ea0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
22eb0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75  pCte->zErr = "mu
22ec0 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65  ltiple recursive
22ed0 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22   references: %s"
22ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22ef0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72         pCte->zEr
22f00 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
22f10 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
22f20 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
22f30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
22f40 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
22f50 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
22f60 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72   }.    pCte->zEr
22f70 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
22f80 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
22f90 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
22fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22fb0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
22fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
22fd0 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
22fe0 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
22ff0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23000 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
23010 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
23020 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
23030 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
23040 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
23050 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
23060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23070 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
23080 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
23090 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
230a0 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
230b0 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
230c0 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
230d0 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
230e0 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
230f0 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
23100 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
23110 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
23120 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
23130 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23140 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
23150 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
23160 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
23170 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
23180 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
23190 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57  >pWith;.  if( pW
231a0 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ith!=0 ){.    as
231b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
231c0 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
231d0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
231e0 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
231f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
23200 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
23210 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
23220 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23230 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
23240 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
23250 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
23260 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
23270 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
23280 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
23290 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
232a0 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
232b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
232c0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
232d0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
232e0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
232f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23300 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
23310 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
23320 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
23330 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
23340 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
23350 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
23360 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
23370 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
23380 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23390 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
233a0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
233b0 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
233c0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
233d0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
233e0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
233f0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
23400 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
23410 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
23420 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
23430 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
23440 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
23450 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
23460 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
23470 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
23480 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
23490 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
234a0 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
234b0 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
234c0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
234d0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
234e0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
234f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23500 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
23510 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
23520 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
23530 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
23540 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
23550 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
23560 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
23570 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
23580 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
23590 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
235a0 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
235b0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
235c0 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
235d0 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
235e0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
235f0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
23600 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
23610 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
23620 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
23630 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
23640 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
23650 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
23660 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
23670 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
23680 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
23690 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
236a0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
236b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
236c0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
236d0 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
236e0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
236f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
23700 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23710 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
23720 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23730 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
23740 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
23750 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
23760 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
23770 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
23780 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
23790 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
237a0 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
237b0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
237c0 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
237d0 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
237e0 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
237f0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
23800 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
23810 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
23820 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
23830 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
23840 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  >pEList;.  sqlit
23850 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
23860 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74  e, findRightmost
23870 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  (p)->pWith, 0);.
23880 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
23890 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
238a0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
238b0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
238c0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
238d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
238e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
238f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
23900 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
23910 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
23920 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
23930 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
23940 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
23950 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
23960 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
23970 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
23980 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
23990 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
239a0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
239b0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
239c0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
239d0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
239e0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
239f0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
23a00 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
23a10 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
23a20 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
23a30 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
23a40 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
23a50 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
23a60 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
23a70 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
23a80 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28  >pTab );.    if(
23a90 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
23aa0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
23ab0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
23ac0 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
23ad0 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
23ae0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
23af0 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
23b00 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
23b10 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
23b20 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
23b30 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
23b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23b50 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65  MIT_CTE.      se
23b60 6c 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c  lectPopWith(pWal
23b70 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  ker, p);.#endif.
23b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
23b90 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
23ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23bb0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
23bc0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
23bd0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
23be0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23bf0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23c00 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
23c10 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
23c20 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
23c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23c40 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
23c50 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
23c60 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
23c70 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
23c80 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
23c90 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
23ca0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
23cb0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
23cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
23cd0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
23ce0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
23cf0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
23d00 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
23d10 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23d20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23d30 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23d40 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
23d50 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
23d60 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23d70 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
23d80 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
23d90 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
23da0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
23db0 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f  lite_sq_%p", (vo
23dc0 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
23dd0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
23de0 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
23df0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
23e00 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
23e10 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
23e20 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
23e30 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
23e40 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
23e50 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
23e60 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
23e70 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
23e80 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
23e90 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
23ea0 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
23eb0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23ec0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23ed0 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
23ee0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
23ef0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
23f00 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
23f10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23f20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23f30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23f40 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
23f50 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
23f60 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
23f70 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
23f80 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
23f90 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23fa0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23fb0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
23fc0 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
23fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23fe0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
23ff0 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
24000 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
24010 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
24020 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
24030 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
24040 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
24050 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
24060 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
24070 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
24080 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
24090 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
240a0 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
240b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
240c0 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
240d0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
240e0 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
240f0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
24100 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
24110 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
24120 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
24130 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
24140 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
24150 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
24160 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
24170 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24190 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
241a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
241b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
241c0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
241d0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
241e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
241f0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
24200 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
24210 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
24220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24230 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
24240 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
24250 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ct);.      }.#en
24260 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
24270 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
24280 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
24290 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
242a0 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
242b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
242c0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
242d0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
242e0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
242f0 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
24300 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
24310 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
24320 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
24330 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
24340 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
24350 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24360 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
24370 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
24380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
24390 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
243a0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
243b0 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
243c0 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
243d0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
243e0 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
243f0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
24400 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
24410 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
24420 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
24430 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
24440 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
24450 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
24460 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
24470 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
24480 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
24490 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
244a0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
244b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
244c0 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
244d0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
244e0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
244f0 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
24500 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
24510 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
24520 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
24530 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
24540 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
24550 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
24560 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
24570 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
24580 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
24590 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
245a0 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
245b0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
245c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
245d0 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
245e0 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
245f0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
24600 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
24610 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
24620 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
24630 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
24640 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
24650 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
24660 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
24670 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
24680 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
24690 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
246a0 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
246b0 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
246c0 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
246d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
246e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
246f0 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
24700 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
24710 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
24720 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
24730 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
24740 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
24750 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
24760 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
24770 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
24780 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
24790 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
247a0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
247b0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
247c0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
247d0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
247e0 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
247f0 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
24800 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
24810 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
24820 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
24830 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
24840 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24860 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
24870 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
24880 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )==0;..    /* Wh
24890 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52  en processing FR
248a0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
248b0 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61  ries, it is alwa
248c0 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20  ys the case.    
248d0 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c  ** that full_col
248e0 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e  umn_names=OFF an
248f0 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  d short_column_n
24900 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20  ames=ON.  The.  
24910 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75    ** sqlite3Resu
24920 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
24930 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
24940 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   so. */.    asse
24950 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
24960 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
24970 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  )==0.          |
24980 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  | ((flags & SQLI
24990 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
249a0 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
249b0 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51       (flags & SQ
249c0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
249d0 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20  es)!=0) );..    
249e0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
249f0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
24a00 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
24a10 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
24a20 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
24a30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24a40 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
24a50 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
24a60 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
24a70 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
24a80 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
24a90 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
24aa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24ab0 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
24ac0 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
24ad0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
24ae0 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
24af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
24b00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
24b10 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
24b20 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
24b30 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
24b40 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
24b50 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24b60 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
24b70 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
24b80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
24b90 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
24ba0 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
24bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
24bc0 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
24bd0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
24be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
24bf0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
24c00 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
24c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24c20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
24c30 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
24c40 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
24c50 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
24c60 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
24c70 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
24c80 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
24c90 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
24ca0 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
24cb0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
24cc0 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
24cd0 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
24ce0 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
24cf0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
24d00 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
24d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
24d20 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
24d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24d40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24d50 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
24d60 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
24d70 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
24d80 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
24d90 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
24da0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
24db0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
24dc0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24dd0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
24df0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
24e00 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
24e10 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
24e20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24e30 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
24e40 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
24e50 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
24e60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24e70 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
24e80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
24e90 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
24ea0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
24eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
24ec0 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
24ed0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
24ee0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
24ef0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24f00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
24f10 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
24f20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
24f30 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
24f40 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
24f50 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
24f60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24f70 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
24f80 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
24f90 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
24fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24fb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24fd0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
24fe0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
24ff0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
25000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
25010 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
25020 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
25030 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
25040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25050 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
25060 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
25070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
25080 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
25090 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
250a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
250b0 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
250c0 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
250d0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
250e0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
250f0 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
25100 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
25110 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
25120 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
25130 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
25140 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
25150 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
25160 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
25170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
25180 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
25190 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
251a0 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
251b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
251c0 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
251d0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
251e0 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
251f0 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
25200 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25210 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25220 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
25230 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
25240 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
25250 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
25260 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
25270 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
25280 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
25290 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
252a0 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
252b0 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
252c0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
252d0 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
252e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
252f0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
25300 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
25310 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
25320 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
25330 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
25340 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
25350 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
25360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25370 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
25380 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
25390 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
253a0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
253b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
253c0 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
253d0 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
253f0 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
25400 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
25410 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
25430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25440 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
25450 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
25460 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
25470 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
25480 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
25490 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
254a0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
254b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
254c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
254d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
254e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
254f0 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
25500 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
25510 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
25520 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
25530 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
25540 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
25550 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25570 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
25580 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
25590 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
255b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
255c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
255d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
255e0 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
255f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
25600 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
25610 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
25620 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
25630 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
25640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25650 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
25660 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
25670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
25680 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
25690 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
256a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
256b0 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
256c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
256d0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
256e0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
256f0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
25700 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
25710 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
25720 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
25730 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
25740 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
25750 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
25760 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
25770 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
25780 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
25790 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
257a0 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ft, pExpr, 0);. 
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
257d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
257f0 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
25800 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
25810 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
25820 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
25830 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
25840 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
25850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25870 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
25880 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
25890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
258a0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
258b0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
258c0 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
258d0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
258e0 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20       sColname.z 
258f0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
25900 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
25910 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
25920 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  en30(zColname);.
25930 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25940 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
25950 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
25960 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
25970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25980 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
25990 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
259a0 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
259b0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
259c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
259d0 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
259e0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
259f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25a00 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
25a10 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
25a20 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
25a30 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
25a40 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
25a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25a60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
25a70 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
25a80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
25a90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25aa0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
25ab0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
25ac0 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
25b00 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
25b10 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
25b20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25b30 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
25b40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25b60 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
25b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
25b80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25b90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25ba0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
25bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25bc0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
25bd0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
25be0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
25bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25c00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25c10 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
25c20 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
25c30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25c50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25c60 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
25c70 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
25c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25ca0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25cb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25cc0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
25cd0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
25ce0 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
25cf0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
25d00 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
25d10 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
25d20 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
25d30 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
25d40 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
25d50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25d60 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
25d70 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
25d80 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
25d90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
25da0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
25db0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
25dc0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
25dd0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
25de0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25df0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
25e00 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
25e10 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
25e20 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
25e30 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
25e40 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
25e50 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
25e60 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
25e70 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25e80 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
25e90 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
25ea0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
25eb0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25ec0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
25ed0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
25ee0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
25ef0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
25f00 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
25f10 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
25f20 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
25f30 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
25f40 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
25f50 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
25f60 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
25f70 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
25f80 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
25f90 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
25fa0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
25fb0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
25fc0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
25fd0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
25fe0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
25ff0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
26000 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
26010 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
26020 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
26030 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
26040 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
26050 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
26060 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
26070 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
26080 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
26090 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
260a0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
260b0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
260c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
260d0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
260e0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
260f0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
26100 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
26110 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
26120 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
26130 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
26140 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
26150 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
26160 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
26170 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
26180 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
26190 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
261a0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
261b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
261c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
261d0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
261e0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
261f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
26200 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
26210 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
26220 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
26230 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
26240 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
26250 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
26260 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
26270 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
26280 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
26290 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
262a0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
262b0 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69  bquery;.    sqli
262c0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
262d0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
262e0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
262f0 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
26300 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  nder;.  w.xSelec
26310 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
26320 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71  ectPopWith;.  sq
26330 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
26340 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
26350 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26360 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
26370 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
26380 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
26390 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
263a0 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
263b0 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
263c0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
263d0 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
263e0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
263f0 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
26400 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
26410 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
26420 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
26430 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
26440 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
26450 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
26460 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
26470 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
26480 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
26490 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
264a0 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
264b0 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
264c0 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
264d0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
264e0 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
264f0 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
26500 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
26510 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
26520 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
26530 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
26540 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
26550 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
26560 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
26570 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
26580 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
26590 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
265a0 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
265b0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
265c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
265d0 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
265e0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
265f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26600 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
26610 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
26620 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
26630 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   );.  if( (p->se
26640 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
26650 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20  ypeInfo)==0 ){. 
26660 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
26670 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
26680 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70  ;.    pParse = p
26690 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
266a0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
266b0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
266c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
266d0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
266e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
266f0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54  From++){.      T
26700 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
26710 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
26720 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21  if( ALWAYS(pTab!
26730 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61  =0) && (pTab->ta
26740 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
26750 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
26760 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
26770 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
26780 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
26790 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65  CT */.        Se
267a0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
267b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
267c0 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b       if( pSel ){
267d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
267e0 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
267f0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
26800 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
26810 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
26820 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
26830 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
26840 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  el);.        }. 
26850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26860 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
26870 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
26880 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
26890 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
268a0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
268b0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
268c0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
268d0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
268e0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
268f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26900 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
26910 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
26920 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
26930 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26940 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
26950 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
26960 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
26970 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
26980 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
26990 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
269a0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
269b0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
269c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
269d0 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
269e0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
269f0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
26a00 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
26a10 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
26a20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
26a30 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
26a40 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
26a50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26a60 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
26a70 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
26a80 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
26a90 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
26aa0 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
26ab0 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
26ac0 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
26ad0 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
26ae0 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
26af0 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
26b00 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
26b10 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
26b20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
26b30 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
26b40 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
26b50 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
26b60 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
26b70 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
26b80 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
26b90 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
26ba0 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
26bb0 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
26bc0 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
26bd0 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
26be0 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
26bf0 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
26c00 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
26c10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
26c20 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
26c30 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
26c40 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
26c50 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
26c60 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
26c70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
26c80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26c90 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
26ca0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
26cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26cd0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
26ce0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
26cf0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
26d00 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
26d10 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
26d20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26d30 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
26d40 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
26d50 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
26d60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26d70 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
26d80 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
26d90 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
26da0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
26db0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
26dc0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
26dd0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
26de0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
26df0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
26e00 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
26e10 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
26e20 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
26e30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
26e40 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
26e50 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
26e60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
26e70 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
26e80 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
26e90 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
26ea0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
26eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
26ec0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
26ed0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
26ee0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
26ef0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
26f00 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
26f10 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
26f20 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
26f30 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
26f40 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
26f50 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
26f60 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
26f70 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
26f80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
26f90 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
26fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
26fb0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
26fc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26fd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26fe0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
26ff0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
27000 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
27010 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
27020 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
27030 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
27040 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
27050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
27060 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
27070 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
27080 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
27090 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
270a0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
270b0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
270c0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
270d0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
270e0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
270f0 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
27100 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
27110 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
27120 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
27130 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
27140 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
27150 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
27160 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
27170 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
27180 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
27190 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
271a0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
271b0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
271c0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
271d0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
271e0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
271f0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
27200 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
27210 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
27220 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
27230 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
27240 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27250 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
27260 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
27270 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
27280 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
27290 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
272a0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
272b0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
272c0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
272d0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
272e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
272f0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
27300 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
27310 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
27320 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
27330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
27340 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
27350 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
27360 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
27370 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27380 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
27390 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
273a0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
273b0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
273c0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
273d0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
273e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
273f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27400 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
27410 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
27420 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
27430 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
27440 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
27450 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27460 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
27470 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
27480 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
274b0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
274c0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
274d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
274e0 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
274f0 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
27500 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
27510 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
27520 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
27530 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
27540 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
27550 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
27560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
27570 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
27580 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
27590 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
275a0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
275b0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
275c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
275d0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
275e0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
275f0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
27600 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
27610 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
27620 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
27630 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
27640 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
27650 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
27660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27670 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
27680 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
27690 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
276a0 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
276d0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
276e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
276f0 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
27700 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
27710 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
27720 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
27730 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
27740 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
27750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
27760 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
27770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
27780 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
27790 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
277a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
277b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
277c0 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
277d0 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
277e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
277f0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
27800 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
27810 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
27820 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
27830 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
27840 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
27850 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
27860 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
27870 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
27880 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
27890 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
278a0 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
278b0 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
278c0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
278d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
278e0 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
278f0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
27900 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
27910 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
27920 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
27930 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
27940 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27950 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
27960 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
27970 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
27980 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
27990 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f   regAgg, SQLITE_
279a0 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
279b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
279c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
279d0 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
279e0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
279f0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
27a00 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
27a10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27a20 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
27a30 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
27a40 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
27a50 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
27a60 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
27a70 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
27a80 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
27a90 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
27aa0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
27ab0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
27ac0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
27ad0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
27ae0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27af0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
27b00 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
27b10 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
27b20 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
27b30 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
27b40 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
27b50 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
27b60 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
27b70 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
27b80 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
27b90 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
27ba0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
27bb0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
27bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27bd0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
27be0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
27bf0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
27c00 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
27c10 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
27c20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
27c30 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
27c40 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
27c50 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
27c60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
27c70 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
27c80 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
27c90 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
27ca0 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
27cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27cc0 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
27cd0 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
27ce0 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
27d00 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
27d10 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
27d20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
27d30 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
27d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
27d50 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
27d60 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
27d70 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
27d80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27d90 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
27da0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
27db0 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
27dc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27dd0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27de0 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
27df0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27e00 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27e10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
27e20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
27e30 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
27e40 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
27e50 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
27e60 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
27e70 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
27e80 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
27e90 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
27ea0 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
27eb0 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
27ec0 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
27ed0 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
27ee0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
27ef0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
27f00 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
27f10 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
27f20 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
27f30 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
27f40 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
27f50 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
27f60 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
27f70 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
27f80 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
27f90 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
27fa0 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
27fb0 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
27fc0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
27fd0 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
27fe0 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
27ff0 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
28000 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
28010 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
28020 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
28030 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
28040 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
28050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28060 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
28070 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
28080 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
28090 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
280a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
280b0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
280c0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
280d0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
280e0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
280f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28100 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
28110 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
28120 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
28130 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
28140 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
28150 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
28160 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
28170 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
28180 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28190 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
281a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
281b0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
281c0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
281d0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
281e0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
281f0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
28200 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
28210 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
28220 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
28230 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
28240 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
28250 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
28260 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
28270 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28280 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
28290 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
282a0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
282b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
282c0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
282d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
282e0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
282f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
28300 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
28310 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
28320 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
28330 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
28340 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
28350 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
28360 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
28370 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
28380 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
28390 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
283a0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
283b0 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
283c0 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
283d0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
283e0 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
283f0 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
28400 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
28410 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
28420 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
28430 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
28440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28450 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
28460 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
28470 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
28480 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
28490 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
284a0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
284b0 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
284c0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
284d0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
284e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
284f0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
28500 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
28510 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
28520 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
28530 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
28540 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
28550 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
28560 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
28570 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
28580 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
28590 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
285a0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
285b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
285c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
285d0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
285e0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
285f0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
28600 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
28610 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
28620 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
28630 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
28640 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
28650 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
28660 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
28670 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
28680 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
28690 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
286a0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
286b0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
286c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
286d0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
286e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
286f0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
28700 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
28710 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
28720 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
28730 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
28740 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
28750 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
28760 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
28770 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
28790 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
287a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
287b0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
287c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
287d0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
287e0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
287f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
28800 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
28810 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
28820 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
28830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28840 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
28850 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
28860 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
28870 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
28880 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
28890 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
288a0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
288b0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
288c0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
288d0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
288e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
288f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28900 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
28910 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
28920 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
28930 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
28940 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
28950 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
28960 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
28970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
28980 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
28990 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
289a0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
289b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
289c0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
289d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
289e0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
289f0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
28a00 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
28a10 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
28a20 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
28a30 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
28a40 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
28a50 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
28a60 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
28a70 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
28a80 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
28a90 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
28aa0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
28ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ad0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
28ae0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
28af0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
28b00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
28b10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
28b20 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
28b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
28b40 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
28b50 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
28b60 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
28b70 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
28b80 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
28b90 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
28ba0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
28bb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
28bc0 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
28bd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
28be0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
28bf0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
28c00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
28c10 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
28c20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
28c30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
28c40 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
28c50 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
28c60 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69  f(sAggInfo));.#i
28c70 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
28c80 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e  ABLED.  pParse->
28c90 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b  nSelectIndent++;
28ca0 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
28cb0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67  ,pParse,p, ("beg
28cc0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  in processing\n"
28cd0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ));.#endif..  as
28ce0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
28cf0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
28d00 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69  Dest!=SRT_DistFi
28d10 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
28d20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
28d30 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
28d40 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73  SRT_Fifo );.  as
28d50 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
28d60 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
28d70 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75  Dest!=SRT_DistQu
28d80 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eue );.  assert(
28d90 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
28da0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
28db0 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20  =SRT_Queue );.  
28dc0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
28dd0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
28de0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
28df0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
28e00 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
28e10 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
28e20 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
28e30 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
28e40 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
28e50 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
28e60 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rd ||.          
28e70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28e80 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65  RT_Queue  || pDe
28e90 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
28ea0 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20  istFifo ||.     
28eb0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
28ec0 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
28ed0 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  e || pDest->eDes
28ee0 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20  t==SRT_Fifo);.  
28ef0 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
28f00 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
28f10 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
28f20 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
28f30 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
28f40 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
28f50 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
28f60 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
28f70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28f80 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
28f90 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
28fa0 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
28fb0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
28fc0 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
28fd0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
28fe0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d  se, p, 0);.  mem
28ff0 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73  set(&sSort, 0, s
29000 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20  izeof(sSort));. 
29010 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
29020 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
29030 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
29040 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
29050 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
29060 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
29070 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29080 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
29090 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
290a0 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
290b0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
290c0 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72  ate)!=0;.  asser
290d0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
290e0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
290f0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
29100 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
29110 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
29120 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
29130 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
29140 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
29150 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
29160 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
29170 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
29180 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
29190 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
291a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
291b0 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
291c0 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
291d0 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
291e0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
291f0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
29200 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
29210 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
29220 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
29230 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
29240 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
29250 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
29260 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
29270 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
29280 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
29290 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
292a0 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
292b0 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
292c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
292d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
292e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
292f0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
29300 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
29310 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
29320 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
29330 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
29340 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
29350 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
29360 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
29370 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
29380 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
29390 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
293a0 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
293b0 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
293c0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
293d0 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
293e0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
293f0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
29400 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
29410 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
29420 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
29430 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
29440 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
29450 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
29460 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
29470 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
29480 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
29490 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
294a0 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
294b0 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
294c0 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
294d0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
294e0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
294f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
29500 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
29510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
29520 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
29530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
29540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
29550 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
29560 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
29570 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
29580 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
29590 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
295a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
295b0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
295c0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
295d0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
295e0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
295f0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
29600 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
29610 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
29620 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
29630 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
29640 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
29650 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
29660 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
29670 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
29680 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
29690 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
296a0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
296b0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
296c0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
296d0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
296e0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
296f0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
29700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
29710 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
29720 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
29730 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
29740 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
29750 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29760 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
29770 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
29780 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
29790 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
297a0 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
297b0 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
297c0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
297d0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
297e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
297f0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
29800 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
29810 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
29820 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
29830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29840 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
29850 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
29860 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
29870 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
29880 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
29890 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
298a0 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
298b0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
298c0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
298d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
298e0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
298f0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
29900 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
29910 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
29920 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
29930 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
29940 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
29950 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
29960 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
29970 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29990 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
299a0 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
299b0 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
299c0 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
299d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
299e0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
299f0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
29a00 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
29a10 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
29a20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29a30 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
29a40 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
29a50 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
29a60 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
29a70 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
29a80 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
29a90 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29aa0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
29ab0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
29ac0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
29ad0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
29ae0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
29af0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
29b00 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
29b10 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
29b20 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
29b30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
29b40 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
29b50 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
29b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29b70 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
29b80 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
29b90 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
29ba0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
29bb0 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
29bc0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
29bd0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
29be0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
29bf0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
29c00 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
29c10 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
29c20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
29c30 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
29c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
29c50 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
29c60 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
29c70 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
29c80 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
29c90 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
29ca0 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
29cb0 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
29cc0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
29cd0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
29ce0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
29cf0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
29d00 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
29d10 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
29d20 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
29d30 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
29d40 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
29d50 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
29d60 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29d70 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
29d80 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29d90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29da0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
29db0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
29dc0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
29dd0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
29de0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
29df0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
29e00 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
29e10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
29e20 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
29e30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
29e40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
29e50 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
29e60 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
29e70 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
29e80 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
29e90 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
29ea0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
29eb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
29ec0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
29ed0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
29ee0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
29ef0 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
29f00 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
29f10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
29f20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29f30 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
29f40 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
29f50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29f60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29f70 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
29f80 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
29f90 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
29fa0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
29fb0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
29fc0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
29fd0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
29fe0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
29ff0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2a000 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2a010 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2a020 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2a030 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2a040 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2a050 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2a060 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2a070 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2a080 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2a090 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2a0a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2a0b0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2a0c0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2a0d0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2a0e0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2a0f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2a100 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2a110 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2a120 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2a130 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2a140 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2a150 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2a160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a170 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2a180 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2a190 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2a1a0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2a1b0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2a1c0 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
2a1d0 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
2a1e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2a1f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2a200 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
2a210 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2a220 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2a230 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
2a240 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2a250 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
2a260 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2a270 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
2a280 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2a290 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
2a2a0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
2a2b0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
2a2c0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
2a2d0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2a2e0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2a2f0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2a300 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2a310 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2a320 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2a330 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2a340 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a350 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2a360 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
2a370 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
2a380 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
2a390 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
2a3a0 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
2a3b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2a3c0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2a3d0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2a3e0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2a3f0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2a400 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2a410 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2a420 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2a430 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2a440 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2a450 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2a460 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2a470 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2a480 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2a490 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2a4a0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2a4b0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2a4c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
2a4d0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
2a4e0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
2a4f0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
2a500 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
2a510 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
2a520 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
2a530 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
2a540 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
2a550 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
2a560 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2a570 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
2a580 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2a590 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
2a5a0 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2a5b0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
2a5c0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2a5d0 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
2a5e0 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
2a5f0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
2a600 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
2a610 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2a620 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
2a630 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
2a640 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
2a650 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
2a660 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
2a670 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
2a680 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
2a690 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
2a6a0 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
2a6b0 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
2a6c0 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
2a6d0 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
2a6e0 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
2a6f0 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
2a700 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
2a710 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
2a720 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
2a730 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
2a740 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2a750 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2a760 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2a770 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
2a780 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
2a790 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2a7a0 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
2a7b0 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
2a7c0 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
2a7d0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2a7e0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2a7f0 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
2a800 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a810 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
2a820 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
2a830 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2a840 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  y;.    sSort.pOr
2a850 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f  derBy = 0;.    /
2a860 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
2a870 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
2a880 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
2a890 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
2a8a0 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
2a8b0 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
2a8c0 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
2a8d0 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
2a8e0 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
2a8f0 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
2a900 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
2a910 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
2a920 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
2a930 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
2a940 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
2a950 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20  nct.isTnct );.  
2a960 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
2a970 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
2a980 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69  clause, then thi
2a990 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69  s sorting.  ** i
2a9a0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
2a9b0 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
2a9c0 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
2a9d0 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
2a9e0 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
2a9f0 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
2aa00 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2aa10 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
2aa20 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
2aa30 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
2aa40 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2aa50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
2aa60 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
2aa70 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
2aa80 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
2aa90 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
2aaa0 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
2aab0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2aac0 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
2aad0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
2aae0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2aaf0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
2ab00 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
2ab10 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2ab20 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2ab30 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
2ab40 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
2ab50 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2ab60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ab70 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
2ab80 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
2ab90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2aba0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2abb0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2abc0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2abd0 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
2abe0 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
2abf0 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
2ac00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2ac10 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2ac20 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
2ac30 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
2ac40 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
2ac50 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
2ac60 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
2ac70 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
2ac80 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
2ac90 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
2aca0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
2acb0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
2acc0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
2acd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ace0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2acf0 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
2ad00 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
2ad10 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
2ad20 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
2ad30 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
2ad40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2ad50 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
2ad60 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f  ctRow = LARGEST_
2ad70 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65  INT64;.  compute
2ad80 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
2ad90 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
2ada0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
2adb0 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
2adc0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
2add0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ade0 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61  GetOp(v, sSort.a
2adf0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
2ae00 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
2ae10 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74  rOpen;.    sSort
2ae20 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2ae30 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2ae40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2ae50 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
2ae60 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2ae70 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2ae80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2ae90 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2aea0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2aeb0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2aec0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2aed0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2aee0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2aef0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2af00 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2af30 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2af40 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2af70 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2af80 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2af90 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2afc0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2afd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2afe0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2aff0 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2b000 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2b010 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2b020 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2b030 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2b040 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2b050 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2b060 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2b070 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2b080 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2b090 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2b0a0 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2b0b0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2b0c0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2b0d0 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2b0e0 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2b0f0 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a  DISTINCT : 0);..
2b100 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
2b110 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
2b120 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2b130 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2b140 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2b150 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
2b160 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
2b190 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
2b1a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2b1b0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2b1c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2b1d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2b1e0 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2b1f0 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2b200 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2b210 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2b220 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2b230 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2b240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b250 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2b260 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2b270 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2b280 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2b290 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2b2a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2b2b0 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2b2c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b2d0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2b2e0 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2b2f0 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2b300 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2b310 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2b320 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2b330 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2b340 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2b350 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2b360 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2b370 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2b380 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2b390 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2b3a0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2b3b0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2b3c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2b3d0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2b3e0 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2b3f0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2b400 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2b410 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2b420 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2b430 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2b440 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2b450 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2b460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2b470 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2b480 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2b490 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2b4a0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2b4b0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2b4c0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2b4d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2b4e0 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2b4f0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2b500 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2b520 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2b530 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b550 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2b560 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2b570 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2b580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2b590 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2b5a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2b5b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2b5c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2b5d0 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2b5e0 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2b5f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2b600 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2b610 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2b620 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2b630 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2b640 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2b650 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2b660 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2b670 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2b680 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2b690 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2b6a0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2b6b0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2b6c0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2b6d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2b6e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2b6f0 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2b700 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2b710 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2b720 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2b730 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2b740 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2b750 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2b760 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2b770 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2b780 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2b790 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2b7c0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2b7d0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2b7e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2b7f0 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2b800 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2b810 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2b820 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2b830 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2b840 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2b850 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2b860 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2b870 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2b880 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2b890 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2b8a0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2b8b0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2b8c0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2b8d0 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2b8e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2b8f0 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2b900 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2b910 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2b920 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2b930 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2b940 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2b950 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2b960 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2b970 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2b980 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2b990 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2b9a0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2b9b0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2b9c0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2b9d0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2b9e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ba10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2ba20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2ba30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2ba40 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2ba50 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2ba60 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2ba70 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2ba80 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2ba90 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2baa0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2bab0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2bac0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2bad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2bae0 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2baf0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2bb00 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2bb10 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2bb20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2bb30 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2bb40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2bb50 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
2bb60 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2bb70 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
2bb80 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2bb90 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
2bba0 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ...    /* If the
2bbb0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2bbc0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2bbd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2bbe0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2bbf0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2bc00 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2bc10 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2bc20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2bc30 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2bc40 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2bc50 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2bc60 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2bc70 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2bc80 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2bc90 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2bca0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2bcb0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
2bcc0 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2bcd0 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2bce0 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2bcf0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2bd00 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2bd10 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2bd20 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2bd30 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2bd40 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2bd50 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2bd60 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2bd70 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2bd80 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2bd90 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2bda0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2bdb0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2bdc0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2bdd0 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2bde0 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2bdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2be00 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2be10 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2be20 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2be30 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2be40 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2be50 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2be60 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2be70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2be80 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2be90 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2bea0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2beb0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2bec0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2bed0 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2bee0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2bef0 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2bf00 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2bf10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2bf20 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2bf30 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2bf40 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2bf50 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2bf60 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2bf70 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2bf80 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2bf90 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2bfa0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2bfb0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2bfc0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2bfd0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2bfe0 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2bff0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
2c000 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2c010 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2c020 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2c030 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2c040 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2c050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2c060 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2c070 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2c080 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2c090 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2c0a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2c0b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2c0c0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2c0d0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2c0e0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2c0f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2c100 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c110 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2c120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2c130 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c140 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2c150 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2c160 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c170 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2c180 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2c190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2c1a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2c1b0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2c1c0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2c1d0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2c1e0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2c1f0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2c200 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2c210 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2c220 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2c230 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c240 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2c250 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2c260 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2c270 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2c280 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2c290 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2c2a0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2c2b0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2c2c0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2c2d0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2c2e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2c2f0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2c300 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2c310 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2c320 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2c330 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2c340 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
2c350 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2c360 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2c370 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2c380 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2c390 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2c3a0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2c3b0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2c3c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2c3d0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2c3e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2c3f0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2c400 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2c410 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2c420 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2c430 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2c440 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2c450 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2c460 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2c470 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2c480 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2c490 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2c4a0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2c4b0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2c4c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2c4d0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2c4e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2c4f0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2c500 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2c510 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2c520 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2c530 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2c540 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2c550 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2c560 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2c570 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2c580 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2c590 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2c5a0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2c5b0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2c5c0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2c5d0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2c5e0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2c5f0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2c600 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2c610 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2c620 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2c630 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2c640 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2c650 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2c660 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2c670 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2c680 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2c690 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2c6a0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2c6b0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2c6c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2c6d0 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a 20  roupBy, 0, 0);. 
2c6e0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2c6f0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2c700 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2c710 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2c720 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2c730 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2c740 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2c750 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2c760 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2c770 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2c780 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2c790 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2c7a0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2c7b0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2c7c0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2c7d0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2c7e0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2c7f0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2c800 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2c810 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2c820 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2c830 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2c840 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2c850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2c860 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2c870 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2c880 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2c890 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2c8a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2c8b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2c8c0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2c8d0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2c8e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2c8f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2c900 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2c910 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2c920 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2c930 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2c940 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2c950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2c960 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2c970 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2c980 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2c990 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2c9a0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2c9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c9c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2c9d0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2c9e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c9f0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2ca00 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2ca10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2ca20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2ca30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2ca40 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2ca50 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2ca60 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2ca70 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2ca80 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2ca90 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2caa0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2cab0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2cac0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2cad0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2cae0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2caf0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2cb00 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2cb10 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2cb20 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2cb30 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2cb40 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2cb50 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2cb60 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2cb70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2cb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2cb90 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2cba0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2cbb0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2cbc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2cbd0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2cbe0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2cbf0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2cc00 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2cc10 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2cc20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2cc30 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2cc40 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2cc50 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2cc60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2cc70 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2cc80 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2cc90 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2cca0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2ccb0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2ccc0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2ccd0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2cce0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2ccf0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2cd00 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2cd10 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2cd20 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2cd30 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2cd40 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2cd50 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2cd60 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2cd70 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2cd80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2cd90 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2cda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cdb0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2cdc0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2cdd0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2cde0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2cdf0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2ce00 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2ce10 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2ce20 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2ce30 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2ce40 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2ce50 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2ce60 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2ce70 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2ce80 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2ce90 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2cea0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2ceb0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2cec0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2ced0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2cee0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2cef0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2cf00 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2cf10 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2cf20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2cf30 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2cf40 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2cf50 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2cf70 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2cf80 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2cf90 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2cfa0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2cfb0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2cfc0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2cfd0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2cfe0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2cff0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2d000 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2d010 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2d020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2d030 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2d040 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2d050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d060 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2d070 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2d080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d090 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2d0a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2d0b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2d0c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2d0d0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2d0e0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2d0f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2d100 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2d110 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2d120 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2d130 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2d140 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2d150 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2d160 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2d170 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2d180 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2d190 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2d1a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2d1b0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2d1c0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2d1d0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2d1e0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2d1f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2d200 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2d210 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2d220 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2d230 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2d260 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2d270 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2d280 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d290 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2d2b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d2c0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2d2d0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2d2e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2d2f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2d300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d310 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2d320 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2d330 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2d340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d350 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2d360 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2d370 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2d380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d390 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d3a0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2d3b0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2d3c0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2d3d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2d3e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2d3f0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2d400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d410 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2d420 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2d430 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2d440 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2d450 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2d460 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2d470 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2d480 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2d490 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2d4a0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2d4b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2d4c0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2d4d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2d4e0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2d4f0 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2d500 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2d510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d520 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2d530 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2d540 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2d550 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2d560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2d570 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
2d580 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2d590 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2d5a0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
2d5b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
2d5c0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d5d0 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
2d5e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2d5f0 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
2d600 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
2d610 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
2d620 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
2d630 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
2d640 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2d650 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
2d660 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
2d670 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
2d680 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
2d690 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2d6a0 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
2d6b0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
2d6c0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
2d6d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2d6e0 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
2d6f0 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
2d700 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
2d710 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
2d720 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2d730 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
2d740 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2d750 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
2d760 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
2d770 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
2d780 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
2d790 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
2d7a0 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
2d7b0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2d7c0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
2d7d0 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
2d7e0 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
2d7f0 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
2d800 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
2d810 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
2d820 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2d830 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2d840 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d850 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2d860 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2d870 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2d880 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
2d890 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2d8a0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
2d8b0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
2d8c0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
2d8d0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
2d8e0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
2d8f0 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
2d900 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
2d910 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
2d920 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2d930 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
2d940 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
2d950 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
2d960 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
2d970 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
2d980 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
2d990 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
2d9a0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
2d9b0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
2d9c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2d9d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d9e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2d9f0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
2da00 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2da10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2da20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2da30 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
2da40 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2da50 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20  sortOut);.      
2da60 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2da70 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2da80 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2da90 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2daa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2dab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2dac0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2dad0 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2dae0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m+j);.          
2daf0 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74  if( j==0 ) sqlit
2db00 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2db10 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
2db20 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  CHE);.        }e
2db30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2db40 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2db50 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2db60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2db70 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2db80 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2db90 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2dba0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2dbb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2dbc0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2dbd0 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2dbe0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2dbf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2dc10 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2dc20 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2dc30 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2dc40 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
2dc50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2dc60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2dc70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2dc80 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
2dc90 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  j1+1); VdbeCover
2dca0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
2dcb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2dcc0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2dcd0 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2dce0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2dcf0 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2dd00 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2dd10 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2dd20 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2dd30 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2dd40 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2dd50 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2dd60 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2dd70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2dd80 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2dd90 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2dda0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2ddb0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2ddc0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2ddd0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2dde0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2ddf0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2de00 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2de10 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2de20 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
2de30 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
2de40 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
2de50 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
2de60 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
2de70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2de80 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
2de90 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
2dea0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
2deb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dec0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2ded0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2dee0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2def0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2df00 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2df10 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
2df20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2df30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2df40 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
2df50 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
2df60 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2df70 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2df80 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2df90 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2dfa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2dfb0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2dfc0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2dfd0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2dfe0 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2dff0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2e000 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2e010 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2e020 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2e030 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2e040 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2e050 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2e060 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e070 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2e080 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2e090 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2e0a0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2e0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e0c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2e0d0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2e0e0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2e0f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2e100 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2e110 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2e120 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2e130 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2e140 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2e150 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2e160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e170 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2e180 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2e190 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2e1a0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2e1b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
2e1c0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
2e1d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e1e0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2e1f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e200 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2e210 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
2e220 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
2e230 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
2e240 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
2e250 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
2e260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2e280 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2e290 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2e2a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e2b0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2e2c0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
2e2d0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
2e2e0 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
2e2f0 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
2e300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e310 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2e320 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
2e330 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2e340 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2e350 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
2e360 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2e370 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2e380 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
2e390 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
2e3a0 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
2e3b0 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
2e3c0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
2e3d0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2e3e0 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
2e3f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
2e400 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
2e410 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
2e420 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
2e430 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
2e440 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2e450 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
2e460 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
2e470 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
2e480 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
2e490 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
2e4a0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
2e4b0 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
2e4c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2e4d0 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
2e4e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e4f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2e500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e510 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e520 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
2e530 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e540 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
2e550 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2e560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e570 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2e580 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2e590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e5a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2e5b0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2e5c0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2e5d0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2e5e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2e5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e600 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2e610 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
2e620 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
2e630 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2e640 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e650 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
2e660 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
2e670 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
2e680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e690 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2e6a0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2e6b0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
2e6c0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2e6d0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2e6e0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2e6f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2e700 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2e710 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
2e720 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2e730 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2e740 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2e750 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2e760 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
2e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e780 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
2e790 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
2e7b0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
2e7c0 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
2e7d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e7e0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2e7f0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2e800 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2e810 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
2e820 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2e830 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
2e840 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2e850 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2e860 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
2e870 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
2e880 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
2e890 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2e8a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2e8b0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
2e8c0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2e8d0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2e8e0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2e8f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e900 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
2e910 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
2e920 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
2e930 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
2e940 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
2e950 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
2e960 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
2e970 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
2e980 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
2e990 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2e9a0 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
2e9b0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2e9c0 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
2e9d0 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
2e9e0 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
2e9f0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
2ea00 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
2ea10 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
2ea20 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
2ea30 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
2ea40 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
2ea50 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
2ea60 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
2ea70 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2ea80 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2ea90 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
2eaa0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
2eab0 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
2eac0 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
2ead0 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
2eae0 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
2eaf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2eb00 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
2eb10 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
2eb20 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
2eb30 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
2eb40 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
2eb50 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
2eb60 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
2eb70 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
2eb80 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
2eb90 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
2eba0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
2ebb0 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
2ebc0 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
2ebd0 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
2ebe0 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
2ebf0 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
2ec00 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
2ec10 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
2ec20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
2ec30 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
2ec40 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
2ec50 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
2ec60 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
2ec70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
2ec80 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
2ec90 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2eca0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
2ecb0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2ecc0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2ecd0 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
2ece0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
2ecf0 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
2ed00 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
2ed10 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed30 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2ed40 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2ed50 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2ed60 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
2ed70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
2ed80 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
2ed90 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
2eda0 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
2edb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2edc0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
2edd0 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
2ede0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
2edf0 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
2ee00 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
2ee10 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2ee20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
2ee30 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
2ee40 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2ee50 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2ee60 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
2ee70 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2ee80 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2ee90 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2eea0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
2eeb0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
2eec0 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
2eed0 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
2eee0 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
2eef0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2ef00 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
2ef10 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
2ef20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
2ef30 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2ef40 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2ef50 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
2ef60 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
2ef70 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
2ef80 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2ef90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
2efa0 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
2efb0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
2efc0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
2efd0 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
2efe0 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
2eff0 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
2f000 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
2f010 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2f020 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2f030 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
2f040 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2f050 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2f060 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2f070 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2f080 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2f090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f0a0 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
2f0b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2f0c0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
2f0d0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
2f0e0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2f0f0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
2f100 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2f110 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
2f120 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
2f130 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
2f140 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2f150 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
2f160 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
2f170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f180 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
2f190 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
2f1a0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
2f1b0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
2f1c0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2f1d0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
2f1e0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
2f1f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
2f200 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
2f210 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
2f220 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
2f230 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
2f240 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2f250 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2f260 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
2f270 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
2f280 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2f290 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2f2a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f2b0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2f2c0 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
2f2d0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2f2e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f2f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f300 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
2f310 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
2f320 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
2f330 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f340 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f350 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
2f360 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2f370 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
2f380 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
2f390 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2f3a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2f3b0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
2f3c0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2f3d0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2f3e0 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
2f3f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2f400 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
2f410 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2f420 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
2f430 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2f440 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
2f450 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
2f460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f470 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2f480 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
2f490 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
2f4a0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
2f4b0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
2f4c0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
2f4d0 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
2f4e0 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
2f4f0 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
2f500 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
2f510 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
2f520 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
2f530 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
2f540 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
2f550 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
2f560 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2f570 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
2f580 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
2f590 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
2f5a0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
2f5b0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
2f5c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
2f5d0 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
2f5e0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2f5f0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
2f600 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
2f610 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
2f620 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
2f630 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
2f640 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
2f650 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f660 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
2f670 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
2f680 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
2f690 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
2f6a0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
2f6b0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
2f6c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
2f6d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f6e0 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
2f6f0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
2f700 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
2f710 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
2f720 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2f730 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
2f740 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
2f750 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
2f760 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
2f770 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
2f780 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2f790 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
2f7a0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
2f7b0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
2f7c0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
2f7d0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
2f7e0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
2f7f0 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
2f800 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
2f810 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
2f820 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
2f830 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
2f840 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
2f850 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
2f860 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
2f870 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
2f880 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
2f890 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
2f8a0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
2f8b0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
2f8c0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
2f8d0 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
2f8e0 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
2f8f0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
2f900 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
2f910 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f920 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
2f930 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f940 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
2f950 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
2f960 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
2f970 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
2f980 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
2f990 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
2f9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9b0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
2f9c0 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
2f9d0 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
2f9e0 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
2f9f0 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
2fa00 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
2fa10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2fa20 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
2fa30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2fa40 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
2fa50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
2fa60 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
2fa70 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2fa80 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2fa90 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
2faa0 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
2fab0 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
2fac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
2fad0 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
2fae0 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
2faf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fb00 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2fb10 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2fb20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
2fb30 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
2fb40 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
2fb50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
2fb60 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
2fb70 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
2fb80 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
2fb90 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
2fba0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
2fbb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fbc0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
2fbd0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2fbe0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2fbf0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2fc00 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2fc10 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2fc20 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
2fc30 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
2fc40 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
2fc50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fc60 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2fc70 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
2fc80 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2fc90 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
2fca0 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
2fcb0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2fcc0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2fcd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2fce0 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
2fcf0 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
2fd00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2fd10 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2fd20 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b  red(pWInfo)>0 ){
2fd30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fd40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fd50 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
2fd60 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
2fd70 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20  el(pWInfo));.   
2fd80 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2fd90 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
2fda0 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
2fdb0 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
2fdc0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2fdd0 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
2fde0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fdf0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2fe00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2fe10 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2fe20 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2fe30 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2fe40 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
2fe50 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2fe60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fe70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2fe80 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
2fe90 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
2fea0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2feb0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2fec0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2fed0 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  t, -1, 0, 0, .  
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fef0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
2ff00 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
2ff10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2ff20 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2ff30 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
2ff40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2ff50 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
2ff60 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
2ff70 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
2ff80 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
2ff90 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2ffa0 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
2ffb0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
2ffc0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2ffd0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
2ffe0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
2fff0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
30000 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
30010 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
30020 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
30030 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
30040 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
30050 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
30060 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
30070 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
30080 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
30090 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 73  pTable(pParse, s
300a0 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
300b0 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
300c0 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
300d0 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
300e0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
300f0 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45  e, p, &sSort, pE
30100 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
30110 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
30120 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
30130 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
30140 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
30150 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
30160 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
30170 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
30180 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
30190 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
301a0 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
301b0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
301c0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
301d0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
301e0 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
301f0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
30200 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
30210 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
30220 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
30230 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
30240 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
30250 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
30260 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
30270 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
30280 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
30290 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
302a0 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
302b0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
302c0 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
302d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
302e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
302f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30300 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
30310 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
30320 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
30330 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
30340 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
30350 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
30360 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
30370 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
30380 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
30390 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
303a0 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
303b0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
303c0 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
303d0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
303e0 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
303f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
30400 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
30410 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
30420 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
30430 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
30440 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
30450 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68  cription of a th
30460 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e  e Select object.
30470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30480 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74  explainOneSelect
30490 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
304a0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
304b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
304c0 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20  (pVdbe, "SELECT 
304d0 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  ");.  if( p->sel
304e0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
304f0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
30500 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  e) ){.    if( p-
30510 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
30520 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
30530 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30540 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49  rintf(pVdbe, "DI
30550 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d  STINCT ");.    }
30560 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
30570 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
30580 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
30590 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
305a0 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c  f(pVdbe, "agg_fl
305b0 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ag ");.    }.   
305c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
305d0 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
305e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
305f0 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22 29  tf(pVdbe, "   ")
30600 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
30610 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
30620 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  Vdbe, p->pEList)
30630 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
30640 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69  inNL(pVdbe);.  i
30650 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
30660 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
30670 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
30680 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
30690 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20  tf(pVdbe, "FROM 
306a0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
306b0 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
306c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
306d0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
306e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
306f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
30700 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
30710 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
30720 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
30730 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64  intf(pVdbe, "{%d
30740 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e  ,*} = ", pItem->
30750 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
30760 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
30770 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
30780 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
30790 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d  ct(pVdbe, pItem-
307a0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
307b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
307c0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
307d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
307e0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 74  intf(pVdbe, " (t
307f0 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74  abname=%s)", pIt
30800 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
30810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30820 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
30830 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
30840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30850 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
30860 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
30870 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
30880 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
30890 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
308a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
308b0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 41  intf(pVdbe, " (A
308c0 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a  S %s)", pItem->z
308d0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
308e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
308f0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
30900 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EFT ){.        s
30910 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
30920 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46  ntf(pVdbe, " LEF
30930 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20  T-JOIN");.      
30940 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
30950 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
30960 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30970 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64  e3ExplainPop(pVd
30980 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
30990 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
309a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
309b0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48 45  intf(pVdbe, "WHE
309c0 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  RE ");.    sqlit
309d0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
309e0 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  dbe, p->pWhere);
309f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30a00 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
30a10 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
30a20 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
30a30 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
30a40 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20  pVdbe, "GROUPBY 
30a50 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
30a60 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
30a70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42  Vdbe, p->pGroupB
30a80 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
30a90 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
30aa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
30ab0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
30ac0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
30ad0 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47  f(pVdbe, "HAVING
30ae0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
30af0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
30b00 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  e, p->pHaving);.
30b10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30b20 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
30b30 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
30b40 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
30b50 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
30b60 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22  Vdbe, "ORDERBY "
30b70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30b80 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56  plainExprList(pV
30b90 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  dbe, p->pOrderBy
30ba0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30bb0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
30bc0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
30bd0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
30be0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
30bf0 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29  pVdbe, "LIMIT ")
30c00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30c10 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
30c20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
30c30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
30c40 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
30c50 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
30c60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30c70 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
30c80 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20   "OFFSET ");.   
30c90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
30ca0 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  xpr(pVdbe, p->pO
30cb0 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
30cc0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
30cd0 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  be);.  }.}.void 
30ce0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
30cf0 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
30d00 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
30d10 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
30d20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
30d30 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75  intf(pVdbe, "(nu
30d40 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20  ll-select)");.  
30d50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
30d60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
30d70 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69  sh(pVdbe);.  whi
30d80 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70  le( p ){.    exp
30d90 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56  lainOneSelect(pV
30da0 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  dbe, p);.    p =
30db0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69   p->pNext;.    i
30dc0 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b  f( p==0 ) break;
30dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30de0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
30df0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30e00 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
30e10 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  s\n", selectOpNa
30e20 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
30e30 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30e40 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45  Printf(pVdbe, "E
30e50 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ND");.  sqlite3E
30e60 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29  xplainPop(pVdbe)
30e70 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74  ;.}../* End of t
30e80 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
30e90 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
30ea0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
30eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
30ef0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
30f00 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
30f10 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f  TREE_EXPLAIN) */
30f20 0a                                               .